programing

닫기 명령을 단추에 바인딩하는 방법

minimums 2023. 5. 28. 20:31
반응형

닫기 명령을 단추에 바인딩하는 방법

은 가장쉬방은을 하는 것입니다.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();
}

(이 MSDN 기사에서 수정됨)

사실 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가 자동으로 이 작업을 수행합니다.

이 속성을 사용하면 대화 상자의 "확인" 및 "취소" 단추를 쉽게 확인할 수 있습니다.또한 키를 단추에 바인딩합니다.

참조: MSDN 버튼.취소 속성입니다.

.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

반응형