0

我想知道如何从我将用户控件放入其中的父窗口更改用户控件。

我有一个用户控件,其中有一个网格和数据网格。现在我想在我的窗口中更改数据网格属性......我想在我的网格中添加另一个控件。像这样的东西

<window>
<usercontrol>
<usercontrol.datagrid backcolor=#ff00000>
<usercontrol/>
<window/>

或者我可以像这样的代码在用户控件网格中添加一个文本块:

<window>
<usercontrol.grid>
<textblock grid.row=1/>
<usercontrol.grid/>
<window/>

用户控件中的所有元素都是公共的,因此我可以从 c# 代码进行更改,但我想使用xaml设计模式进行更改

在 Windows 窗体中,我创建了一个从数据网格视图继承的用户控件,然后我对其进行了自定义。我在 10 个窗口和第 11 个窗口中使用它,我需要稍微更改数据网格视图我不更改用户控件,因为它会更改所有窗口,所以我只是更改用户控件在第 11 个窗口中,请帮助!

4

1 回答 1

3

我认为您应该在后面的 UserControl 代码中为 DataGrid 的 BackgroundColor(或您想要更改的任何属性)创建一个 DependencyProperty:

public static DependencyProperty GridColorProperty = DependencyProperty.Register("GridColor", typeof (Brush),
                                                                                         typeof (UserControl1),
                                                                                         new FrameworkPropertyMetadata(
                                                                                             null,
                                                                                             FrameworkPropertyMetadataOptions
                                                                                                 .AffectsRender));
        public Brush GridColor
        {
            get { return (Brush)GetValue(GridColorProperty); }
            set { SetValue(GridColorProperty, value);}
        } 

之后,您应该在 UserControl 的 XAML 中将 DataGrid 的 Color 属性绑定到它:

<DataGrid Background="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=YourControlType}, Path=GridColor}"/>

现在您可以像这样使用控件:

<YourControlType GridColor="Green"/>

至于控件添加,这取决于您要达到的目标。最直接的方法是从网格派生您的用户控件。或者可能来自 ContentControl 就足以满足您的目的

编辑:这就是您可以放入新控件的方式。从 Grid 派生控件:

<Grid x:Class="WpfApplication3.UserControl1"
             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"
      xmlns:app="clr-namespace:WpfApplication3" mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <DataGrid Background="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=app:YourControlType}, Path=GridColor}"/>
</Grid> 

你会这样使用它:

<YourControlType GridColor="Green">
            <Button Grid.Row="1"/>
</YourControlType>

但实际上这是一件很奇怪的事情,我最好从 ContentControl 派生它:

<ContentControl x:Class="WpfApplication3.YourControlType"
             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"
      xmlns:app="clr-namespace:WpfApplication3" mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <ContentControl.Template>
        <ControlTemplate TargetType="ContentControl">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <DataGrid Background="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=app:YourControlType}, Path=GridColor}"/>
                <ContentPresenter Content="{TemplateBinding Content}" Grid.Row="1"/>
            </Grid>
        </ControlTemplate>
    </ContentControl.Template>
</ContentControl>

这就是你如何使用它:

<YourControlType GridColor="Green">
       <Button/>
</YourControlType>

作为另一种可能性,您可以为控件的内容创建依赖属性。后面的代码:

public static readonly DependencyProperty InnerContentProperty =
            DependencyProperty.Register("InnerContent", typeof (FrameworkElement), typeof (YourControlType),
                                        new FrameworkPropertyMetadata(default(FrameworkElement),
                                                                      FrameworkPropertyMetadataOptions.AffectsRender));

        public FrameworkElement InnerContent
        {
            get { return (FrameworkElement) GetValue(InnerContentProperty); }
            set { SetValue(InnerContentProperty, value); }
        }

用户控件的 XAML:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <DataGrid Background="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=WpfApplication3:UserControl1}, Path=GridColor}"/>
    <ContentControl Grid.Row="1" Content="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=app:YourControlType}, Path=InnerContent}"/>
</Grid>

用法:

<YourControlType GridColor="Green">
    <YourControlType.InnerContent>
        <Button/>
    </YourControlType.InnerContent>
</YourControlType>

但是,如果您只想快速简单地回答最初的问题,那么您无法直接从 XAML 解决 UserControl 的内部控件。= )

于 2012-05-06T09:12:26.313 回答