Проблемы связывания WPF со словарями ресурсов - PullRequest
1 голос
/ 22 июля 2011

Я разработал пользовательский элемент управления сеткой данных.Этот элемент управления состоит из двух частей: одна представляет собой пользовательский шаблон, используемый самой сеткой данных, а другая - мой пользовательский элемент управления, который добавляет область заголовка к сетке данных.

У меня есть класс с именем 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, так что в моем коде я могу изменить его значение.

Любая помощь может сделать мой день, фактически, все мои выходные.Спасибо.

1 Ответ

0 голосов
/ 23 июля 2011

Почему нельзя поменять кисть?Вы должны иметь возможность просто назначить ссылку кисти на элемент управления.Это не работает?FindResource должен выполнить поиск по родительскому элементу FrameworkElement, который вы вызываете, по дереву, по ресурсам приложения, а затем по темам, заканчивающимся в системных ресурсах.Прости мой 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...