2013-07-15 64 views
3

我已經覆蓋WPF默認最大化,最小化按鈕像解釋here。但是,在我的情況下,我不想使用Image覆蓋該按鈕的背景圖像,而是想添加自己的模板。如何繼承WPF風格的按鈕行爲?

所以我創建了一個ResourceDictionary,它應用了最大化/最小化/恢復/關閉按鈕的樣式。

事情是我重寫模板。作爲一個例子,看到PART_MINIMIZE按鈕:

<Button x:Name="PART_MINIMIZE" 
     Width="30" 
     Height="20" 
     Margin="0,0,4,0" 
     HorizontalAlignment="Center" 
     Template="{DynamicResource MinimizeButton}" 
     VerticalAlignment="Center" 
     DockPanel.Dock="Right"> 
    </Button> 

DynamicResource稱爲MinimizeButton stablishes完整模板。當我點擊按鈕時出現問題。當我重寫Template部分時,默認情況下,它沒有我定義的行爲。但是我希望默認情況下保持最大化/最小化/恢復/關閉行爲,而不會覆蓋它。所以...

我該怎麼說在模板中繼承按鈕的行爲?或者如何模擬它們?

謝謝!

回答

1

操作與Window應放置在一個特殊的類,它是可從XAML,像:

操作Close

<Trigger Property="IsChecked" Value="True"> 
    <Setter Property="Controls:WindowBehaviours.Close" Value="True" /> 
</Trigger> 

操作Hide

<Trigger Property="IsChecked" Value="True"> 
    <Setter Property="Controls:WindowBehaviours.Hide" Value="True" /> 
</Trigger> 

它使用ToggleButton因爲他有物業IsChecked通過觸發器訪問。這些屬性 - 附加取決於屬性。

上市WindowBehaviours類:使用ToggleButtonsWindowBehaviours類的

public static class WindowBehaviours 
{ 
    // Close the Window 
    public static void SetClose(DependencyObject target, bool value) 
    { 
     target.SetValue(CloseProperty, value); 
    } 

    public static readonly DependencyProperty CloseProperty = 
               DependencyProperty.RegisterAttached("Close", 
               typeof(bool), 
               typeof(WindowBehaviours), 
               new UIPropertyMetadata(false, OnClose)); 

    private static void OnClose(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     if (e.NewValue is bool && ((bool)e.NewValue)) 
     { 
      Window window = GetWindow(sender); 

      if (window != null) 
      { 
       window.Close(); 
      } 
     } 
    } 

    // Hide the Window 
    public static void SetHide(DependencyObject target, bool value) 
    { 
     target.SetValue(HideProperty, value); 
    } 

    public static readonly DependencyProperty HideProperty = 
               DependencyProperty.RegisterAttached("Hide", 
               typeof(bool), 
               typeof(WindowBehaviours), 
               new UIPropertyMetadata(false, OnHide)); 

    private static void OnHide(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     if (e.NewValue is bool && ((bool)e.NewValue)) 
     { 
      Window window = GetWindow(sender); 

      if (window != null) 
      { 
       window.WindowState = WindowState.Minimized; 
      } 
     } 
    } 

    // Full the Window 
    public static void SetFull(DependencyObject target, bool value) 
    { 
     target.SetValue(FullProperty, value); 
    } 

    public static readonly DependencyProperty FullProperty = 
               DependencyProperty.RegisterAttached("Full", 
               typeof(bool), 
               typeof(WindowBehaviours), 
               new UIPropertyMetadata(false, OnFull)); 

    private static void OnFull(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     if (e.NewValue is bool && ((bool)e.NewValue)) 
     { 
      Window window = GetWindow(sender); 

      if (window != null) 
      { 
       window.WindowState = WindowState.Maximized; 
      } 
     } 
    } 

    // Set the Window in Normal 
    public static void SetNormal(DependencyObject target, bool value) 
    { 
     target.SetValue(NormalProperty, value); 
    } 

    public static readonly DependencyProperty NormalProperty = 
               DependencyProperty.RegisterAttached("Normal", 
               typeof(bool), 
               typeof(WindowBehaviours), 
               new UIPropertyMetadata(false, OnNormal)); 

    private static void OnNormal(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     if (e.NewValue is bool && ((bool)e.NewValue)) 
     { 
      Window window = GetWindow(sender); 

      if (window != null) 
      { 
       window.WindowState = WindowState.Normal; 
      } 
     } 
    } 

    // Get the Window 
    private static Window GetWindow(DependencyObject sender) 
    { 
     Window window = null; 

     if (sender is Window) 
     { 
      window = (Window)sender; 
     } 

     if (window == null) 
     { 
      window = Window.GetWindow(sender); 
     } 

     return window; 
    } 
} 

樣品:

CloseButton

 <Style x:Key="ToggleButtonWindowClose" TargetType="{x:Type ToggleButton}"> 
      <Setter Property="Background" Value="Transparent" /> 
      <Setter Property="SnapsToDevicePixels" Value="True" /> 

      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ToggleButton">       
         <Grid> 
          <ContentPresenter x:Name="MyContentPresenter" Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" /> 

          <Border x:Name="BorderClose" Background="Beige" BorderThickness="0" Width="22" Height="22" HorizontalAlignment="Right" Margin="0,6,8,0" VerticalAlignment="Top" Opacity="0" /> 
          <Path x:Name="CloseWindow" SnapsToDevicePixels="True" ToolTip="Закрыть окно" Width="18" Height="17" Margin="0,0,10,0" HorizontalAlignment="Right" VerticalAlignment="Center" Stretch="Fill" Fill="#2D2D2D" Data="F1 M 26.9166,22.1667L 37.9999,33.25L 49.0832,22.1668L 53.8332,26.9168L 42.7499,38L 53.8332,49.0834L 49.0833,53.8334L 37.9999,42.75L 26.9166,53.8334L 22.1666,49.0833L 33.25,38L 22.1667,26.9167L 26.9166,22.1667 Z " /> 
         </Grid> 

         <ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter TargetName="CloseWindow" Property="Fill" Value="#C10000" /> 
           <Setter TargetName="BorderClose" Property="Opacity" Value="1" /> 
          </Trigger> 

          <Trigger Property="IsChecked" Value="True"> 
           <Setter Property="Controls:WindowBehaviours.Close" Value="True" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style>  

HideButton

<Style x:Key="ButtonWindowHide" TargetType="{x:Type ToggleButton}"> 
      <Setter Property="Background" Value="Transparent" /> 
      <Setter Property="SnapsToDevicePixels" Value="True" /> 

      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ToggleButton"> 
         <Grid> 
          <ContentPresenter x:Name="MyContentPresenter" Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" /> 

          <Border x:Name="BorderHide" Background="Beige" BorderThickness="0" Width="22" Height="22" HorizontalAlignment="Right" Margin="0,6,32,0" VerticalAlignment="Top" Opacity="0" /> 
          <Path x:Name="HideWindow" SnapsToDevicePixels="True" ToolTip="Скрыть окно" Width="14" Height="19" Margin="0,0,36,0" HorizontalAlignment="Right" VerticalAlignment="Center" Stretch="Fill" Fill="#2D2D2D" Data="F1 M 42,19.0002L 34,19.0002L 34,43.7502L 24,33.7502L 24,44.2502L 38,58.2502L 52,44.2502L 52,33.7502L 42,43.7502L 42,19.0002 Z " /> 
         </Grid> 

         <ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter TargetName="HideWindow" Property="Fill" Value="#0094FF" /> 
           <Setter TargetName="BorderHide" Property="Opacity" Value="1" /> 
          </Trigger> 

          <Trigger Property="IsChecked" Value="True"> 
           <Setter Property="Controls:WindowBehaviours.Hide" Value="True" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

FullScreenButton

  <Style x:Key="ButtonWindowFull" TargetType="{x:Type ToggleButton}"> 
      <Setter Property="Background" Value="Transparent" /> 
      <Setter Property="SnapsToDevicePixels" Value="True" /> 

      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ToggleButton"> 
         <Grid> 
          <ContentPresenter x:Name="MyContentPresenter" Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" /> 

          <Border x:Name="BorderFull" Background="Beige" BorderThickness="0" Width="22" Height="22" HorizontalAlignment="Right" Margin="0,6,58,0" VerticalAlignment="Top" Opacity="0" /> 
          <Path x:Name="FullWindow" SnapsToDevicePixels="True" Width="19" Height="19" Margin="0,0,60,0" HorizontalAlignment="Right" VerticalAlignment="Center" Stretch="Fill" Fill="#2D2D2D" Data="F1 M 30.25,58L 18,58L 18,45.75L 22,41.75L 22,50.75L 30,42.75L 33.25,46L 25.25,54L 34.25,54L 30.25,58 Z M 58,45.75L 58,58L 45.75,58L 41.75,54L 50.75,54L 42.75,46L 46,42.75L 54,50.75L 54,41.75L 58,45.75 Z M 45.75,18L 58,18L 58,30.25L 54,34.25L 54,25.25L 46,33.25L 42.75,30L 50.75,22L 41.75,22L 45.75,18 Z M 18,30.25L 18,18L 30.25,18L 34.25,22L 25.25,22L 33.25,30L 30,33.25L 22,25.25L 22,34.25L 18,30.25 Z "> 
           <Path.ToolTip> 
            <ToolTip x:Name="FullWindowToolTip" Content="Развернуть окно" /> 
           </Path.ToolTip> 
          </Path> 
         </Grid> 

         <ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter TargetName="FullWindow" Property="Fill" Value="#0094FF" /> 
           <Setter TargetName="BorderFull" Property="Opacity" Value="1" /> 
          </Trigger> 

          <Trigger Property="IsChecked" Value="True"> 
           <Setter Property="Controls:WindowBehaviours.Full" Value="True" /> 
           <Setter TargetName="FullWindow" Property="Data" Value="F1 M 54.2499,34L 42,34L 42,21.7501L 45.9999,17.7501L 45.9999,26.7501L 53.9999,18.7501L 57.2499,22.0001L 49.2499,30.0001L 58.2499,30.0001L 54.2499,34 Z M 34,21.7501L 34,34L 21.75,34L 17.75,30.0001L 26.75,30.0001L 18.75,22.0001L 22,18.7501L 30,26.7501L 30,17.7501L 34,21.7501 Z M 21.75,42L 34,42L 34,54.25L 30,58.25L 30,49.25L 22,57.25L 18.75,54L 26.75,46L 17.75,46L 21.75,42 Z M 42,54.25L 42,42L 54.2499,42L 58.2499,46L 49.2499,46.0001L 57.2499,54L 53.9999,57.25L 45.9999,49.25L 45.9999,58.25L 42,54.25 Z " /> 
           <Setter TargetName="FullWindowToolTip" Property="Content" Value="Hide in window" /> 
          </Trigger> 

          <Trigger Property="IsChecked" Value="False"> 
           <Setter Property="Controls:WindowBehaviours.Normal" Value="True" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
+1

好,好!有效! :) – Sonhja

0

沒有太多要繼承。我建議你編寫簡單的處理程序並將它們分配給按鈕單擊事件。處理程序可以如下:

protected void MinimizeClick(object sender, RoutedEventArgs e) 
    { 
     WindowState = WindowState.Minimized; 
    } 
    protected void MaximizeClick(object sender, RoutedEventArgs e) 
    { 
     WindowState = WindowState.Maximized ; 
    } 

    protected void RestoreClick(object sender, RoutedEventArgs e) 
    { 
     WindowState = (WindowState == WindowState.Normal) ? WindowState.Maximized :  WindowState.Normal; 
    } 

    protected void CloseClick(object sender, RoutedEventArgs e) 
    { 
     Close(); 
    } 
+0

我無法訪問比特特什,因爲它們是通過窗口預定義的人。唯一的是我可以重寫它們。但不能建立一個處理程序,並將其分配... – Sonhja

1

我覺得,因爲它失去了什麼,你應該是設置的ContentTemplate沒有模板的ContentTemplate定義瞭如何將您的按鈕看起來像沒有控制的基本操作,你不應該重寫模板暫停其基本功能..

這是你可以編輯按鈕的ContentTemplate ..

<Button Grid.Column="3" FontSize="22" FontWeight="Light" Opacity="0.5" BorderThickness="0" Margin="15,0,0,0" > 
      <Button.ContentTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal" > 
         <TextBlock Text="Search" /> 
         <TextBlock Text="&#xE11A;" FontFamily="Segoe UI Symbol" FontSize="22" VerticalAlignment="Center" /> 
        </StackPanel> 
       </DataTemplate> 
      </Button.ContentTemplate> 
     </Button> 

,如果你想設置你的按鈕看起來應該像在App.xaml中設置它設置它的DataTemplate像這樣..

 <DataTemplate x:Key="tempbtn"> 
      <Grid > 
       <Grid.RowDefinitions> 
        <RowDefinition /> 
        <RowDefinition /> 
       </Grid.RowDefinitions> 
       <TextBlock Grid.Row="0" Text="hellotxt" FontSize="30" /> 
       <TextBlock Grid.Row="1" Text="asdl;fjkladjglkad" FontSize="50" /> 
      </Grid> 
     </DataTemplate> 

我們這個DataTemplate中對您的按鈕在XAML這樣的..

<Button ContentTemplate="{StaticResource tempbtn}" Width="500" Height="200" /> 
+0

我找不到如何更改'ContentTemplate'而不更改'Template' ...任何想法? – Sonhja