2013-06-30 238 views
3

我是WPF中的新成员,我需要制作一个按钮(X)来模拟表格中的X按钮。首先我设置WindowStyle="None"。然后做一个Rectangle在WPF中添加X关闭按钮

<Rectangle Height="16" HorizontalAlignment="Left" Margin="482,4,0,0" Name="x_btn" Stroke="#00000000" VerticalAlignment="Top" Width="17" MouseEnter="x_btn_MouseEnter" MouseLeftButtonUp="x_btn_MouseLeftButtonUp"> 
    <Rectangle.Fill> 
     <ImageBrush ImageSource="/Red%20Crescent;component/Images/x_btn.png" /> 
    </Rectangle.Fill>    
</Rectangle> 

这个我想改变后面的代码Background Image OnMousEnter事件之后:

private void x_btn_MouseEnter(object sender, MouseEventArgs e) 
{   
} 

private void x_btn_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    this.Close(); 
} 

请帮助一样快,您可以。

注:我试图使用Button,但它留下了一个边框,我不想这样。

回答

6

在你的情况下,最好使用Style作为Button,并使用Path而不是Image。要正确实现关闭功能,最好通过DependencyProperty来实现,并直接在Style中设置该值。

<Window x:Class="CloseButtonHelp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:CloseButtonHelp" 
     Title="MainWindow" Height="350" Width="525"> 

<Window.Resources> 
    <!-- Our style for the ToggleButton --> 
    <Style x:Key="ToggleButtonWindowClose" TargetType="{x:Type ToggleButton}"> 
     <!-- Here you can set the initial properties for the control --> 
     <Setter Property="Background" Value="Transparent" /> 
     <Setter Property="SnapsToDevicePixels" Value="True" /> 

     <!-- Template needs to completely re-writing the standard control --> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ToggleButton}"> 
        <Grid> 
         <!-- Then responsible for the content. In our case it did not really need, because it is set Path --> 
         <ContentPresenter x:Name="MyContentPresenter" Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" />  
         <!-- Our Path. Shows a cross -->      
         <Path x:Name="CloseWindow" SnapsToDevicePixels="True" ToolTip="Close window" 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> 

        <!-- Trigger fires on the property --> 
        <ControlTemplate.Triggers> 
         <!-- Here change the color when the mouse cursor --> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter TargetName="CloseWindow" Property="Fill" Value="#C10000" /> 
         </Trigger> 

         <!-- Use ToggleButton, because it has a property IsChecked, accessible through the style --> 
         <Trigger Property="IsChecked" Value="True"> 
          <Setter Property="local:WindowBehaviours.Close" Value="True" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 

<Grid> 
    <!-- Set the our style by key ---> 
    <ToggleButton Name="CloseButton" Style="{StaticResource ToggleButtonWindowClose}" /> 
</Grid> 
</Window> 

WindowBehaviorsClass上市:

public static class WindowBehaviours 
{ 
    // Closing 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(); 
      } 
     } 
    } 

    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; 
    } 
} 

更多信息参见MSDN

+0

感谢您的代码..但是当您使用模板时,您能描述xaml代码...因为我是wpf的新手 –

+0

请参阅我的编辑。为了更好地理解风格,研究相关资源(MSDN,WPF图书),因为要解释所有的答案都不是真实的。 –

+0

谢谢你的描述......不过我有一个问题,如果你不介意的话...我怎样才能建立一个分离式的文件,只是添加到表单 ,因为我有一个大的计划和控制很多 –