如何根据明暗主题通过静态资源修改Border的MinimumHeightRequest
问题原因与解决方法
错误根源
你当前的写法是把Style对象直接绑定给了MinimumHeightRequest属性,但这个属性需要的是double类型的数值,而非Style对象,所以高度设置完全不生效;而Stroke属性绑定的是颜色资源(类型匹配),所以能正常切换主题色。
解决方法一:定义主题化数值资源直接绑定
在App.xaml的全局资源中,通过ThemeDictionaries分别定义浅色/深色主题下的高度数值:
<Application.Resources> <ResourceDictionary> <ResourceDictionary.ThemeDictionaries> <!-- 浅色主题资源 --> <ResourceDictionary x:Key="Light"> <x:Double x:Key="NieuwsBorderMinHeight">300</x:Double> </ResourceDictionary> <!-- 深色主题资源 --> <ResourceDictionary x:Key="Dark"> <x:Double x:Key="NieuwsBorderMinHeight">220</x:Double> </ResourceDictionary> </ResourceDictionary.ThemeDictionaries> <!-- 保留你原有的其他全局资源 --> </ResourceDictionary> </Application.Resources>
然后在Border中直接引用这个资源:
<Border x:Name="NieuwsBorder" MinimumHeightRequest="{StaticResource NieuwsBorderMinHeight}" Stroke="{AppThemeBinding Light={StaticResource LightBorderColor}, Dark={StaticResource Maroon}}" StrokeShape="RoundRectangle 10" StrokeThickness="2">
解决方法二:用Style统一管理主题属性
如果希望用Style来集中管理Border的所有主题相关属性,可在App.xaml中定义带主题字典的Style:
<Style x:Key="NieuwsBorderStyle" TargetType="Border"> <!-- 通用属性 --> <Setter Property="StrokeThickness" Value="2"/> <Setter Property="StrokeShape" Value="RoundRectangle 10"/> <!-- 主题专属属性 --> <Style.Resources> <ResourceDictionary> <ResourceDictionary.ThemeDictionaries> <ResourceDictionary x:Key="Light"> <Setter Property="MinimumHeightRequest" Value="300"/> <Setter Property="Stroke" Value="{StaticResource LightBorderColor}"/> </ResourceDictionary> <ResourceDictionary x:Key="Dark"> <Setter Property="MinimumHeightRequest" Value="220"/> <Setter Property="Stroke" Value="{StaticResource Maroon}"/> </ResourceDictionary> </ResourceDictionary.ThemeDictionaries> </ResourceDictionary> </Style.Resources> </Style>
之后在Border中直接应用该Style即可:
<Border x:Name="NieuwsBorder" Style="{StaticResource NieuwsBorderStyle}">
内容的提问来源于stack exchange,提问作者Bas H
相关产品推荐
相关产品推荐

