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);}
        } 

その後、DataGrid の Color プロパティを UserControl の XAML でバインドする必要があります。

<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); }
        }

UserControl の 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 に答える