Я быстро просмотрел 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 для меня все еще довольно новый зверь.
Спасибо!