Как нарисовать форму или линии внутри кнопки WPF такого размера для элемента управления, чтобы кнопка не расширялась навсегда?

Я быстро просмотрел Google и StackOverflow, но не смог найти никого, кто столкнулся бы с этой проблемой.

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

Вот мой стиль XAML для кнопки:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="TabCloseButtonStyle" TargetType="{x:Type Button}">
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="Content">
            <Setter.Value>
                <Grid>
                    <Line Stroke="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=Foreground}"
                            X1="0"
                            Y1="0"
                            X2="{Binding RelativeSource={RelativeSource AncestorType=Grid}, Path=ActualWidth, Mode=OneWay}"
                            Y2="{Binding RelativeSource={RelativeSource AncestorType=Grid}, Path=ActualHeight, Mode=OneWay}"/>
                    <Line Stroke="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=Foreground}"
                            X1="0"
                            Y1="{Binding RelativeSource={RelativeSource AncestorType=Grid}, Path=ActualHeight, Mode=OneWay}"
                            X2="{Binding RelativeSource={RelativeSource AncestorType=Grid}, Path=ActualWidth, Mode=OneWay}"
                            Y2="0"/>
                </Grid>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

И я создаю свою кнопку, просто в качестве теста, вот так:

<Window x:Class="WpfTestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="124" Width="569">
    <Grid Background="#2b3c59">
        <StackPanel Orientation="Horizontal">

            <!-- Other controls removed for clarity -->

            <Button Style="{DynamicResource TabCloseButtonStyle}"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Bottom"
                    Padding="2"
                    Margin="0, 10, 0, 0"
                    MinWidth="50"
                    MinHeight="50"></Button>
        </StackPanel>
    </Grid>
</Window>

И вот здесь все идет ужасно неправильно. Когда вы запускаете приложение, кнопка будет бесконечно расширяться, по одному пикселю за раз, по горизонтали и вертикали, пока не достигнет высоты окна.

Теперь я могу понять, почему это происходит: линии фактически выходят на одну единицу за пределы окна. ширина и высота сетки, вызывающие расширение сетки на одну единицу, затем происходит ретрансляция, привязка данных заставляет строки перерисовываться до бесконечности.

Итак, чтобы попытаться справиться с этим, я решил поместить grid, но тогда, независимо от того, что я делаю с HorizontalAlignment и VerticalAlignment, я получаю как Canvas, так и Grid с нулевой шириной и высотой, что означает, что я не получаю свой крест, что сильно раздражает. Если я привязываюсь к свойствам кнопки ActualWidth и ActualHeight, я просто получаю X, верхний левый угол которого центрирован по центру кнопки.

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

Спасибо!

7
задан Bart Read 5 November 2010 в 20:08
поделиться