Как добавить событие Click в пользовательский WPF WindowTitle - PullRequest
0 голосов
/ 11 марта 2012

Я сделал рестайлинг окна WPF, все работает очень хорошо.Однако теперь мне нужно отобразить всплывающее меню, когда кто-то нажимает на строку заголовка.Я не понимаю, как я могу это сделать, так как щелчок заголовка вниз обрабатывается мышью вниз в одной из границ стиля, и это общий стиль, который я применяю к нескольким окнам?

Стиль окна выглядит так:

<Style x:Key="MYWindow" TargetType="{x:Type Window}">
    <Setter Property="ResizeMode" Value="NoResize" />
    <Setter Property="WindowStyle" Value="None" />
    <Setter Property="Background" Value="{StaticResource BGBrush}" />
    <Setter Property="Foreground" Value="{StaticResource FGBrush}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Window}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="26"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="26"/>
                        <ColumnDefinition Width="26"/>
                        <ColumnDefinition Width="26"/>
                    </Grid.ColumnDefinitions>

                    <Border Background="{TemplateBinding Background}" BorderThickness="1" BorderBrush="{x:Null}" CornerRadius="5,5,5,5" BitmapEffect="{StaticResource DropShadow}" Grid.Row="0" Grid.RowSpan="2" Grid.Column="0" Grid.ColumnSpan="4"/>

                    <ContentPresenter Margin="2" ClipToBounds="True" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="4"/>

                    <Border Background="{StaticResource GreyGradientBrush}" BorderThickness="1" BorderBrush="{x:Null}" CornerRadius="5,5,0,0" BitmapEffect="{StaticResource WindowTitleShadow}" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4" MouseDown="HandleTitleBarMouseDown"/>

В настоящее время HandleTitleBarMouseDown обрабатывает перетаскивание окна следующим образом:

  partial class MYStyles
  {

    public void HandleTitleBarMouseDown(object sender, MouseButtonEventArgs e)
    {
      Window window = GetWindow(sender);

      window.DragMove();
    }
}

Я повторно использую стиль следующим образом:

<Window x:Class="TestWPF.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"        
    xmlns:local="clr-namespace:TestWPF"
    Style="{DynamicResource MYWindow}" Title="Test MY Window" Height="599" Width="891" SnapsToDevicePixels="False" WindowStyle="None" Padding="0" MouseDown="">

Мне нужно как-то вызвать событие в классе Window1, но я не знаю, как этого добиться?

Ответы [ 2 ]

1 голос
/ 11 марта 2012

Вы можете использовать MouseMove событие для перетаскивания:

 private void HandleTitleBar_MouseMove(object sender, MouseEventArgs e)
 {
     if (e.LeftButton == MouseButtonState.Pressed)
     {
         Window window = GetWindow(sender);
         window.DragMove();
      }
 }

Затем вы можете использовать MouseDown событие, чтобы показать свой пользовательский Popup с желаемым содержимым.

0 голосов
/ 11 марта 2012

Вы можете использовать глобальное перехватывание событий.

Поместите эту строку в ваш app.xaml.cs или любой другой класс, вызываемый при запуске приложения:

EventManager.RegisterClassHandler(typeof(Window), Window.PreviewMouseUpEvent, new MouseButtonEventHandler(OnWindowPreviewMouseUp));

И объявите OnWindowPreviewMouseUpобработчик события:

void OnWindowPreviewMouseUp(object sender, MouseButtonEventArgs e)
        {
            //do your implementation
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...