元素不采用FallbackValues(对于Style属性)

时间:2013-12-28 06:43:00

标签: wpf user-controls

我遇到了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,它只是起作用。其他人不是。 您可以建议调试这种非常奇怪的行为吗?

2 个答案:

答案 0 :(得分:3)

BindingBase.FallbackValue州的文档

如果出现以下情况,则绑定会成功返回值:

  1. 绑定源的路径已成功解析。
  2. 值转换器(如果有)能够转换结果值。
  3. 结果值对绑定目标(目标)属性有效。
  4. 如果1和2返回DependencyProperty.UnsetValue,则target属性设置为FallbackValue的值(如果有)。

    因此,如果正在设置任何DependencyProperties或返回[null]值,它将被视为有效绑定,并且不会使用FallbackValue。

    我不知道这是否是您的问题,因为我需要查看更多解决方案,但是值得一试。

    我希望这会有所帮助。

答案 1 :(得分:0)

就像@EngineerSpock在上面的评论中所说,请改用TargetNullValue