닫기 명령을 단추에 바인딩하는 방법
은 가장쉬방은을 하는 것입니다.ButtonClick
합니다.Window.Close()
어떻게 을 방법, 하만어이통것해을게떻지▁a▁doing통▁method해▁this▁through,이.Command
구속력이 있습니까?
약간의 XAML만 있으면 됩니다.
<Window x:Class="WCSamples.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Close"
Executed="CloseCommandHandler"/>
</Window.CommandBindings>
<StackPanel Name="MainStackPanel">
<Button Command="ApplicationCommands.Close"
Content="Close Window" />
</StackPanel>
</Window>
그리고 약간의 C#...
private void CloseCommandHandler(object sender, ExecutedRoutedEventArgs e)
{
this.Close();
}
사실 C# 코드가 없어도 가능합니다.핵심은 상호 작용을 사용하는 것입니다.
<Button Content="Close">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction TargetObject="{Binding ElementName=window}" MethodName="Close"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
이 기능이 작동하려면 다음과 같이 설정합니다.x:Name
다음 두 개의 네임스페이스를 추가합니다.
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
, Expression Blend SDK DLL을 .Microsoft.Expression.Interactions
.
블렌드가 없는 경우 여기에서 SDK를 다운로드할 수 있습니다.
실제 시나리오에서는 단순한 클릭 핸들러가 지나치게 복잡한 명령 기반 시스템보다 나을 수 있지만 다음과 같은 작업을 수행할 수 있습니다.
이 문서의 릴레이 명령 사용 http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
public class MyCommands
{
public static readonly ICommand CloseCommand =
new RelayCommand( o => ((Window)o).Close() );
}
<Button Content="Close Window"
Command="{X:Static local:MyCommands.CloseCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Window}}}"/>
에 음과같창표시경우된이은다▁was▁window▁with▁shown▁Window.ShowDialog()
:
내가 아는 가장 간단한 해결책은 다음과 같은 것을 설정하는 것입니다.IsCancel
.Button
:
<Button Content="Close" IsCancel="True" />
바인딩이 필요하지 않습니다. WPF가 자동으로 이 작업을 수행합니다.
이 속성을 사용하면 대화 상자의 "확인" 및 "취소" 단추를 쉽게 확인할 수 있습니다.또한 키를 단추에 바인딩합니다.
.NET 4.5의 경우 System Commands 클래스가 트릭(.NET 4.0 사용자는 WPF Shell Extension Google - Microsoft를 사용할 수 있습니다.창문들.셸 또는 니콜라스 솔루션).
<Window.CommandBindings>
<CommandBinding Command="{x:Static SystemCommands.CloseWindowCommand}"
CanExecute="CloseWindow_CanExec"
Executed="CloseWindow_Exec" />
</Window.CommandBindings>
<!-- Binding Close Command to the button control -->
<Button ToolTip="Close Window" Content="Close" Command="{x:Static SystemCommands.CloseWindowCommand}"/>
코드 이면에 다음과 같은 처리기를 구현할 수 있습니다.
private void CloseWindow_CanExec(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
private void CloseWindow_Exec(object sender, ExecutedRoutedEventArgs e)
{
SystemCommands.CloseWindow(this);
}
처음에는 이것이 어떻게 작동하는지 이해하는 데 어려움을 겪었기 때문에 실제로 무슨 일이 일어나고 있는지 더 나은 설명을 올리고 싶었습니다.
제가 조사한 바에 따르면 이러한 문제를 처리하는 가장 좋은 방법은 명령 바인딩을 사용하는 것입니다.프로그램의 모든 항목에 "메시지"가 브로드캐스트됩니다. 할 은 그서당해할일을 입니다.CommandBinding
기본적으로 "이 메시지를 들을 때 이 작업을 수행하십시오."라고 말합니다.
질문에서 사용자가 창을 닫으려고 합니다.우리가 해야 할 첫 번째 일은 다음과 같은 경우에 호출될 우리의 기능을 설정하는 것입니다.SystemCommand.CloseWindowCommand
가 브로드캐스트됩니다.선택적으로 명령 실행 여부를 결정하는 기능을 할당할 수 있습니다.예를 들어 양식을 닫고 사용자가 저장했는지 확인합니다.
MainWindow.xaml.cs (또는 기타 코드백)
void CloseApp( object target, ExecutedRoutedEventArgs e ) {
/*** Code to check for State before Closing ***/
this.Close();
}
void CloseAppCanExecute( object sender, CanExecuteRoutedEventArgs e ) {
/*** Logic to Determine if it is safe to Close the Window ***/
e.CanExecute = true;
}
이제 다음과 같이 "연결"을 설정해야 합니다.SystemCommands.CloseWindowCommand
그리고CloseApp
그리고.CloseAppCanExecute
MainWindow.xaml(또는 명령 바인딩을 구현하는 모든 항목)
<Window.CommandBindings>
<CommandBinding Command="SystemCommands.CloseWindowCommand"
Executed="CloseApp"
CanExecute="CloseAppCanExecute"/>
</Window.CommandBindings>
명령을 항상 실행할 수 있어야 한다는 것을 알고 있는 경우 CanExecute를 생략할 수 있습니다. 응용 프로그램에 따라 저장이 좋은 예가 될 수 있습니다.예는 다음과 같습니다.
<Window.CommandBindings>
<CommandBinding Command="SystemCommands.CloseWindowCommand"
Executed="CloseApp"/>
</Window.CommandBindings>
마지막으로 UIElement에 CloseWindow 명령을 전송하도록 지시해야 합니다.
<Button Command="SystemCommands.CloseWindowCommand">
명령과 실제 실행할 기능 간의 링크를 설정한 다음 컨트롤에 명령을 전송하도록 지시하여 "모두 명령 닫기 창 명령에 대해 함수를 실행합니다."라고 말합니다.
WinForms와 같은 래퍼 없이 실행된 기능을 다시 사용할 수 있으므로(클릭 이벤트를 사용하고 이벤트 기능 내에서 함수를 호출) 이 방법은 매우 유용합니다.
protected override void OnClick(EventArgs e){
/*** Function to Execute ***/
}
WPF에서 명령에 Function을 연결하고 UI 요소에 명령에 연결된 Function을 대신 실행하도록 지시합니다.
이번 일로 일이 해결되길...
제가 작동하는 한 가지 옵션은 이 기능을 동작으로 설정하는 것입니다.
동작:
public class WindowCloseBehavior : Behavior<Window>
{
public bool Close
{
get { return (bool) GetValue(CloseTriggerProperty); }
set { SetValue(CloseTriggerProperty, value); }
}
public static readonly DependencyProperty CloseTriggerProperty =
DependencyProperty.Register("Close", typeof(bool), typeof(WindowCloseBehavior),
new PropertyMetadata(false, OnCloseTriggerChanged));
private static void OnCloseTriggerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var behavior = d as WindowCloseBehavior;
if (behavior != null)
{
behavior.OnCloseTriggerChanged();
}
}
private void OnCloseTriggerChanged()
{
// when closetrigger is true, close the window
if (this.Close)
{
this.AssociatedObject.Close();
}
}
}
XAML 창에서 참조를 설정하고 ViewModel의 Boolean "Close" 속성에 Behavior's Close 속성을 바인딩합니다.
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<i:Interaction.Behaviors>
<behavior:WindowCloseBehavior Close="{Binding Close}" />
</i:Interaction.Behaviors>
따라서 보기에서 동작의 닫기 속성에 바인딩된 보기 모델의 닫기 속성을 변경하는 IC 명령을 할당합니다.PropertyChanged 이벤트가 발생하면 Behavior가 OnCloseTriggerChanged 이벤트를 실행하고 AssociatedObject를 닫습니다...창이에요.
언급URL : https://stackoverflow.com/questions/1065887/how-to-bind-close-command-to-a-button
'programing' 카테고리의 다른 글
내 프로그램을 작성하지 않고 Azure blob 저장소에 파일을 업로드하려면 어떻게 해야 합니까? (0) | 2023.05.28 |
---|---|
애플리케이션 인사이트에 로그인 (0) | 2023.05.28 |
목표-C와 C++는 어떻게 다릅니까? (0) | 2023.05.23 |
bash의 문자열을 이스케이프하는 명령 (0) | 2023.05.23 |
npm 모듈의 모든 버전을 나열하는 방법은 무엇입니까? (0) | 2023.05.23 |