【问题标题】:WPF binding issues with resource dictionaries资源字典的 WPF 绑定问题
【发布时间】:2011-07-22 18:52:16
【问题描述】:

我开发了一个自定义数据网格控件。这个控件有两个部分,一个是数据网格本身使用的自定义模板,另一个是我的自定义控件,它为数据网格添加了一个标题区域。

我有一个名为 CustomDataGrid 的类,这里是 XAML。

<UserControl x:Class="MDT_Designer.Presentation.ScreenControls.CustomDataGrid"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         Name="CDataGrid" >
<UserControl.Resources>
    <ResourceDictionary x:Key="Dictionary" Source="CustomizedControls.xaml"/>
</UserControl.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="{Binding ElementName=CDataGrid, Path=TitleAreaHeight}"/>
        <RowDefinition Height="{Binding ElementName=CDataGrid, Path=GridAreaHeight}"/>
    </Grid.RowDefinitions>
    <Grid Name="TitleArea" DockPanel.Dock="Top" Background="{Binding ElementName=CDataGrid, Path=TitleBackColor}" >
        <Viewbox HorizontalAlignment="{Binding ElementName=CDataGrid, Path=TitleAlignment}">
            <TextBlock Name="TitleText" Text="{Binding ElementName=CDataGrid, Path=Title}" Margin="2,0,0,0" FontFamily="{Binding ElementName=CDataGrid, Path=TitleFontFamily}" Foreground="{Binding ElementName=CDataGrid, Path=TitleTextColor}"/>
        </Viewbox>
    </Grid>
    <DataGrid Name="DataGridArea" Grid.Row="1" IsReadOnly="True" HorizontalGridLinesBrush="DarkGray" VerticalGridLinesBrush="DarkGray" VerticalScrollBarVisibility="Visible" Background="AliceBlue" >
    </DataGrid>
</Grid>
</UserControl>

在我的 CustomDataGrid.xaml.cs 文件中,我已经定义了这样的属性。

    public static DependencyProperty TitleAlignmentProperty = DependencyProperty.Register("TitleAlignment", typeof(HorizontalAlignment), typeof(CustomDataGrid));
    public HorizontalAlignment TitleAlignment
    {
        get { return (HorizontalAlignment)base.GetValue(TitleAlignmentProperty); }
        set { base.SetValue(TitleAlignmentProperty, value); }
    }

我只是展示一个作为示例,这很有效。我确实希望我可以更改 XAML 中的绑定以摆脱 ElementName=CDataGrid,但是作为替代的任何方法都行不通。

现在我的问题。我的数据网格控件本身的自定义模板存储在字典 CustomizedControls.xaml 中。

这是绑定问题的一个示例。我必须创建这个资源。

<LinearGradientBrush x:Key="HeaderBackgroundBrush" EndPoint="0.5,1" StartPoint="0.5,0" >
    <GradientStop Color="{DynamicResource {x:Static SystemColors.ControlLightColorKey}}" Offset="0" />
    <GradientStop Color="{DynamicResource {x:Static SystemColors.ControlDarkColorKey}}" Offset="1" />
</LinearGradientBrush>

然后我在列标题的边框定义中使用它。

<Style TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                <Grid>
                    <Border x:Name="columnHeaderBorder" BorderThickness="1" Padding="3,0,3,0" 
            Background="{DynamicResource HeaderBackgroundBrush}"> 
                            <Border.BorderBrush>
                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                <GradientStop Color="{DynamicResource BorderLightColor}" Offset="0" />
                                <GradientStop Color="{DynamicResource BorderDarkColor}" Offset="1" />
                            </LinearGradientBrush>
                        </Border.BorderBrush>
                        <ContentPresenter x:Name="columnHeaderPresenter"  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Style="{DynamicResource HeaderContentStyle}" />
                    </Border>

                    <Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}" />
                    <Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后要在我的代码中更改它,我必须这样做。

        LinearGradientBrush headerBrush = (LinearGradientBrush)TryFindResource("HeaderBackgroundBrush");
        headerBrush.GradientStops[0] = new GradientStop(brush.Color, 0.0);

我不能改变画笔本身,我只能改变画笔的一个属性。我已经尝试了所有我能想到的绑定技术,但是当样式在字典中时似乎没有任何效果。

我希望能够以某种方式绑定诸如 BorderLightColor 之类的东西,这是 BorderBrush 设置,以便在我后面的代码中更改它的值。

任何帮助都会让我开心,事实上它会让我整个周末都开心。谢谢。

【问题讨论】:

    标签: wpf resources


    【解决方案1】:

    为什么不能换笔刷?您应该能够将画笔引用分配给控件。这不起作用吗? FindResource 应该搜索您正在调用它的 FrameworkElement 的父元素,并在树上搜索应用程序资源,然后搜索以 System Resources 结尾的主题。原谅我的VB...

    Private Sub Button_Click(ByVal sender as Object, ByVal e as System.Windows.RoutedEventArgs)
        Dim MyBrush2 as Brush = Me.FindResource("Brush2")   
        Me.MyRect.Background = MyBrush2
    End Sub
    

    以及窗口内容:

    <Window.Resources>
        <LinearGradientBrush x:Key="Brush1" EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="Black" Offset="0"/>
            <GradientStop Color="White" Offset="1"/>
        </LinearGradientBrush>
        <LinearGradientBrush x:Key="Brush2" EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="#FF0800FF" Offset="0"/>
            <GradientStop Color="Red" Offset="1"/>
        </LinearGradientBrush>
    </Window.Resources>
    
    <Grid x:Name="LayoutRoot">
        <Grid x:Name="MyRect" HorizontalAlignment="Left" Margin="63,66,0,174" Width="242" Background="{DynamicResource Brush1}" />
        <Button Content="Button" HorizontalAlignment="Right" Height="60" Margin="0,117,95,0" VerticalAlignment="Top" Width="156" Click="Button_Click"/>
    </Grid>
    

    【讨论】:

    • 我对您的回复有些困惑。我要做的是通过样式更改绑定到控件的画笔。也许我只需要始终以编程方式创建和分配画笔,而不必费心使用绑定。我会试试看。
    • 我的另一个大问题是字典的绑定。我无法绑定到字典中定义的任何属性。如果我在 UserControl.Resources 部分定义样式,我可以将其绑定到代码中公开的 DepandancyProperty 并在后面的代码中对其进行操作。但是,我将相同的样式移到字典中,但似乎无法使其绑定到我的代码中定义的 depandancy 属性。我很想将所有内容从字典中移出,所以它会起作用,但我真的很想知道我做错了什么,或者错过了做什么。
    • 如果是您遇到问题的样式,您始终可以在 UserControl.Resources 中创建一个原本为空的样式,并基于其他地方的资源使用它。然后它将反映其他样式,但在 UserControl 中定义。对 ResourceDictionary 版本的更改将保留。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多