5

我是新手,WPF我需要制作一个按钮 (X) 来模拟X表单中的按钮。首先我设置WindowStyle="None". 然后做一个Rectangle

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

请尽快提供帮助。

注意:我尝试使用 aButton但它留下了边框,我不想要那个。

4

1 回答 1

7

在您的情况下,最好使用StyleButton并使用Path而不是Image. 要正确实现关闭的功能,最好通过 a 来实现,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

于 2013-06-30T14:29:49.623 回答