Создание пользовательской кнопки «Закрыть» в WPF - PullRequest
4 голосов
/ 04 марта 2011

Я довольно новичок в WPF / C # и думаю о реализации собственного декоратора окон. Мне нужно создать кнопку Закрыть , которая в основном ведет себя точно так же, как кнопка закрытия или x , которая появляется в хроме каждого окна приложений Windows.

Ответы [ 5 ]

12 голосов
/ 04 марта 2011

Просто вызовите функцию close() с вашей кнопки:

WPF:

<Button Name="CloseButton" Content="x" Click="CloseButton_Click" />

Кодовый код:

private void CloseButton_Click(object sender, RoutedEventArgs e)
{
    Close();
}
2 голосов
/ 05 июля 2011

Если вы хотите использовать архитектуру MVVM, вы можете передать имя вашего окна в качестве параметра команды, а в команде вы можете закрыть окно.

Код будет выглядеть примерно так:

Button Command="{Binding MainCloseButtonCommand}"
CommandParameter="{Binding ElementName=mainWindow}"

private void performMainCloseButtonCommand(object Parameter)
{
    Window objWindow  = Parameter as Window;
    objWindow.Close();
}
1 голос
/ 29 марта 2014

Если вам нужна кнопка, закрывающая диалоговое окно Window, вы можете добавить для него IsCancel свойство:

<Button Name="CloseButton"
        IsCancel="True" ... />

Это означает следующее MSDN:

Когда вы устанавливаете для свойства IsCancel Button значение true, вы создаете кнопку, зарегистрированную в AccessKeyManager. Кнопка активируется, когда пользователь нажимает клавишу ESC .

Теперь, если вы нажмете на эту кнопку или нажмете Esc , тогда диалоговое окно Window закрывается, но не работает для обычного MainWindow.

Чтобы закрыть MainWindow, вы можете просто добавить обработчик Click, который уже был показан.Но если вы хотите более элегантное решение, которое бы соответствовало стилю MVVM, вы можете добавить следующее присоединенное поведение:

public static class ButtonBehavior
{
    #region Private Section

    private static Window MainWindow = Application.Current.MainWindow;

    #endregion

    #region IsCloseProperty

    public static readonly DependencyProperty IsCloseProperty;

    public static void SetIsClose(DependencyObject DepObject, bool value)
    {
        DepObject.SetValue(IsCloseProperty, value);
    }

    public static bool GetIsClose(DependencyObject DepObject)
    {
        return (bool)DepObject.GetValue(IsCloseProperty);
    }

    static ButtonBehavior()
    {
        IsCloseProperty = DependencyProperty.RegisterAttached("IsClose",
                                                              typeof(bool),
                                                              typeof(ButtonBehavior),
                                                              new UIPropertyMetadata(false, IsCloseTurn));
    }

    #endregion

    private static void IsCloseTurn(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        if (e.NewValue is bool && ((bool)e.NewValue) == true)
        {
            if (MainWindow != null)
                MainWindow.PreviewKeyDown += new KeyEventHandler(MainWindow_PreviewKeyDown);

            var button = sender as Button;

            if (button != null)
                button.Click += new RoutedEventHandler(button_Click);
        }
    }

    private static void button_Click(object sender, RoutedEventArgs e)
    {
        MainWindow.Close();
    }

    private static void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Escape)
            MainWindow.Close();
    }
}

И в Window используйте это так:

<Window x:Class="MyProjectNamespace.MainWindow" 
        xmlns:local="clr-namespace:MyProjectNamespace">

    <Button Name="CloseButton"
            local:ButtonBehavior.IsClose="True" ... />

Теперь MainWindow можно закрыть, нажав кнопку или нажав Esc , и все это происходит независимо от View (UI).

1 голос
/ 04 марта 2011

Если вы добавляете кнопку к вашему текущему виду, скажем из кода:

var closeButton = new Button();
closeButton.Click += closeButton_Click;

// Add the button to the window
Content = closeButton;

Тогда вы можете ответить на событие и просто позвонить Close() следующим образом:

void closeButton_Click(object sender, RoutedEventArgs e)
{
    Close();
}

Что в основном делает это, так это то, что он добавляет кнопку к вашему Window / UserControl, и когда вы нажимаете ее, она закрывает окно.

Если вы сделаете это из XAML, это может выглядетькак это:

<Button Name="closeButton" Click="closeButton_Click" />

0 голосов
/ 04 марта 2011

На самом деле это так:

<Window Name = "Chrome">
   .
   .
  <Button Name="closeButton" onClick="terminateApplication"/>
   .
</Window>

и в файле CS,

private void terminateApplication(object sender, RoutedEventArgs e)
{
     Chrome.Close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...