[英]WPF custom window round corners
我的自定義 window 的 xaml 樣式有問題。該樣式將 window 的邊緣設置為圓形,並查看它是否停靠到邊緣。 但在更改 window 的大小后它不再起作用。在啟動時所有邊緣都是圓形的,當我將它捕捉到屏幕的右側或左側時它顯示角不圓。 但是如果我調整 window 的大小,它會在整個運行時完全禁用圓角。
我如何更改我的 xaml 代碼以獲得在 window 樣式中不顯示圓角的行為,但如果我調整 window 的大小?
以下代碼是我的樣式代碼。 您可以將其設置為 window 並根據需要調整 window 的大小,您會看到我的問題嗎?
<Style x:Key="ModernWindowStyle" TargetType="{x:Type Window}">
<Setter Property="AllowsTransparency" Value="True"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="ResizeMode" Value="CanResize"/>
<Setter Property="WindowStyle" Value="None"/>
<Setter Property="MinHeight" Value="300"/>
<Setter Property="MinWidth" Value="530"/>
<Setter Property="MaxHeight" Value="{x:Static SystemParameters.MaximizedPrimaryScreenHeight}"/>
<Setter Property="MaxWidth" Value="{x:Static SystemParameters.MaximizedPrimaryScreenWidth}"/>
<Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<WindowChrome
CaptionHeight="50"
CornerRadius="8"
ResizeBorderThickness="5"/>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Window">
<Border BorderThickness="1"
BorderBrush="#FFD9D9D9">
<Border.Resources>
<core:MultiValueEqualityConverter x:Key="multiValueEqualityConverter" />
</Border.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<ContentPresenter Grid.Row="1" />
</Grid>
<Border.Style>
<Style TargetType="Border">
<Setter Property="CornerRadius"
Value="8" />
<Setter Property="Background" >
<Setter.Value>
<LinearGradientBrush EndPoint="0,0" StartPoint="0,1">
<GradientStop Color="#FF99BDCE" />
<GradientStop Color="White" Offset="0.7"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Value="False">
<Condition.Binding>
<MultiBinding Delay="1000" Converter="{StaticResource multiValueEqualityConverter}" ConverterParameter="HI">
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Width"
Mode="OneWay" />
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="RestoreBounds.Width"
Mode="OneWay" />
</MultiBinding>
</Condition.Binding>
</Condition>
<Condition Value="False">
<Condition.Binding>
<MultiBinding Delay="1000"
Converter="{StaticResource multiValueEqualityConverter}">
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Height"
Mode="OneWay" />
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="RestoreBounds.Height"
Mode="OneWay" />
</MultiBinding>
</Condition.Binding>
</Condition>
<Condition Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=WindowState}"
Value="Normal" />
</MultiDataTrigger.Conditions>
<Setter Property="CornerRadius"
Value="0" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
和 MultiValueEqualityConverter
public class MultiValueEqualityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values?.All(o => o?.Equals(values[0]) == true) == true || values?.All(o => o == null) == true;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
我認為問題是RestoreBounds.Height
或RestoreBounds.Width
不通知值已更改,但Height
或Width
通知。
所以MultiBinding
“認為” RestoreBounds
沒有改變並且確實使用舊值,結果為false
。
要修復它,只需將 window 傳遞給轉換器並檢查那里的RestoreBounds
。
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Value="False">
<Condition.Binding>
<MultiBinding Delay="1000" Converter="{StaticResource multiValueEqualityConverter}">
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Height"
Mode="OneWay" />
<Binding RelativeSource="{RelativeSource TemplatedParent}" Mode="OneWay" />
</MultiBinding>
</Condition.Binding>
</Condition>
<Condition Value="False">
<Condition.Binding>
<MultiBinding Delay="1000" Converter="{StaticResource multiValueEqualityConverter}" ConverterParameter="HI">
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Width"
Mode="OneWay" />
<Binding RelativeSource="{RelativeSource TemplatedParent}" Mode="OneWay" />
</MultiBinding>
</Condition.Binding>
</Condition>
<Condition Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=WindowState}"
Value="Normal" />
</MultiDataTrigger.Conditions>
<Setter Property="CornerRadius"
Value="0" />
</MultiDataTrigger>
</Style.Triggers>
public class MultiValueEqualityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values[1] is System.Windows.Window wnd)
{
return wnd.Height == wnd.RestoreBounds.Height && wnd.Width == wnd.RestoreBounds.Width;
}
return false;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.