我遇到了UserControl开发的问题。
UserControl公开了几个DP(Style类型)。 UserControl的元素将它们的Style属性绑定到它们。为了显示用户未定义样式的内容,UserControl为这些绑定提供FallbackValues(在UserControl.Resources部分中定义的样式)。问题是UserControl的唯一一个元素是FallbackValue,其他元素则不是。似乎有些事情会覆盖FallbackValues。 此外,VS设计师通常会显示UserControl本身(我的意思是,似乎正确地采用了FallbackValues)。但是当UserControl驻留在其他UserControl或Window中时,我会看到之前描述的行为。
以下是UserControl的xaml:
<UserControl
Background="White" Style="{Binding UserControlStyle}"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<UserControl.Resources>
<LinearGradientBrush x:Key="GeneralKeyBackground" StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Offset="0" Color="#FFA0A9B2" />
<GradientStop Offset="1" Color="#FF5B626A" />
</LinearGradientBrush>
<LinearGradientBrush x:Key="StationNameBackground" StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Offset="0" Color="#FFC4E3FF" />
<GradientStop Offset="0.462" Color="#FFE7F3FF" />
</LinearGradientBrush>
<Style x:Key="DefaultStationNameForSearchingStyle" TargetType="TextBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Grid>
<TextBox TextAlignment="Center" Text="{TemplateBinding Text}"
Background="Transparent" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="FontSize" Value="22" />
<Setter Property="Foreground" Value="Black" />
</Style>
<Style x:Key="DefaultButtonsStyle" TargetType="customControls:RoundButton">
<Setter Property="Template" Value="{DynamicResource RoundButtonTemplate}" />
<Setter Property="Width" Value="85" />
<Setter Property="Height" Value="75" />
<Setter Property="FontFamily" Value="Verdana" />
<Setter Property="FontSize" Value="22" />
<Setter Property="Background" Value="{StaticResource GeneralKeyBackground}" />
<Setter Property="Foreground" Value="White" />
<Style.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="Gray" />
</Trigger>
</Style.Triggers>
</Style>
<DataTemplate x:Key="StationTemplate">
<customControls:RoundButton MinWidth="350" MinHeight="60" DataContext="{Binding}" Content="{Binding }" />
</DataTemplate>
<Style x:Key="DefaultTitleStyle" TargetType="TextBlock">
<Setter Property="Control.FontSize" Value="48" />
<Setter Property="Control.Foreground" Value="Black" />
</Style>
<Style x:Key="DefaultStationNameForSearchingBorderStyle" TargetType="Border">
<Setter Property="BorderBrush" Value="#FF2C8BF5" />
<Setter Property="Background" Value="{StaticResource StationNameBackground}" />
</Style>
<!-- EndRegion -->
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Text="Select Station"
Style="{Binding TitleStyle, FallbackValue={StaticResource DefaultTitleStyle}}" />
<userControls:ScrollableWrapPanel x:Name="StationsPanel" Grid.Row="1" ItemsSource="{Binding FilteredStations}"
ItemTemplate="{StaticResource StationTemplate}"
ButtonsStyle="{StaticResource DefaultButtonsStyle}" />
<Border Grid.Row="2" MinWidth="460" MinHeight="65"
Style="{Binding StationNameForSearchingBorderStyle, FallbackValue={StaticResource DefaultStationNameForSearchingBorderStyle}}">
<TextBox x:Name="StationName" Width="420" Height="55" SelectionChanged="TextBoxBase_OnSelectionChanged"
Style="{Binding StationNameForSearchingStyle, FallbackValue={StaticResource DefaultStationNameForSearchingStyle}}" />
</Border>
<Border Grid.Row="3" Style="{Binding KeyboardBorderStyle}">
<virtualKeyboard:VirtualKeyboard x:Name="VirtualKeyboard"
GeneralKeyStyle="{Binding KeyboardButtonsStyle, FallbackValue={StaticResource DefaultButtonsStyle}}"/>
</Border>
</Grid>
VirtualKeyboard按钮始终采用FallbackValue,它只是起作用。其他人不是。 您可以建议调试这种非常奇怪的行为吗?
答案 0 :(得分:3)
如果出现以下情况,则绑定会成功返回值:
如果1和2返回DependencyProperty.UnsetValue,则target属性设置为FallbackValue的值(如果有)。
因此,如果正在设置任何DependencyProperties或返回[null]值,它将被视为有效绑定,并且不会使用FallbackValue。
我不知道这是否是您的问题,因为我需要查看更多解决方案,但是值得一试。
我希望这会有所帮助。
答案 1 :(得分:0)
就像@EngineerSpock在上面的评论中所说,请改用TargetNullValue
。