4

UserControlWindows フォーム フォームでホストされています。これUserControlには、ToolBarさまざまなボタンがある場所があります。

<ToolBar>
   <Button Content="{StaticResource AllGreenIcon}"/>
   <Button Content="{StaticResource AllRedIcon}"/>
   <Button Content="{StaticResource RedRectangle}"/>
   <Button Content="{StaticResource GreenRectangle}"/>
</ToolBar>

desinger では次のようになります。

デザイナー モードのボタン付きツールバー

問題は、アイコンが 4 つの長方形で構成されているボタンにあります。これら 2 つのボタンのコンテンツは、実行時にレンダリングされません。

実行時は次のようになります。

実行時のツールバー

のコードAllGreenIcon:

<UserControl.Resources>

<Grid x:Key="AllGreenIcon" Height="16" Width="16" Effect="{StaticResource IconDropShadowEffect}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <ContentControl Content="{StaticResource GreenRectangle}" Margin="0,0,1,1" Grid.Row="0" Grid.Column="0"/>
    <ContentControl Content="{StaticResource GreenRectangle}" Margin="1,0,0,1" Grid.Row="0" Grid.Column="1"/>
    <ContentControl Content="{StaticResource GreenRectangle}" Margin="0,1,1,0" Grid.Row="1" Grid.Column="0"/>
    <ContentControl Content="{StaticResource GreenRectangle}" Margin="1,1,0,0" Grid.Row="1" Grid.Column="1"/>
</Grid>


</UserControl.Resources>

どうすればこれを修正できますか?前もって感謝します!

4

2 に答える 2

1

この一般的な問題は、それぞれUIElementが単一の親を持つという WPF (論理) 要件によるものです。あなたの場合、リソースに要素を追加しています。GreenRectangle次に、この要素をリソースのContent複数ContentControlのとして使用していますAllGreenIcon。要素がビジュアル ツリーに接続されるたびに、その親参照が変更されます。これにより、要素がビジュアル ツリーに 1 回だけ存在することが保証されます。たとえば、すべての緑色のボタンは、GreenRectangle要素の同じインスタンスを使用します。がビジュアル ツリーに接続されるたびにGreenRectangleその親が変更されるため、GreenRectangeリソースを使用する最後の項目のみが実際に要素を表示します。

UIElements結論として、リソースでの宣言と使用は避けてください。Styles とsを使用する必要がありますControltemplate

注:あなたのソリューションAllGreenIconでは、リソースで宣言されたグリッドに同じ問題があります。UI の 2 つの異なる場所で同時に使用することはできません。ContentTemplate代わりにaを使用してください。

元:

<Button ContentTemplate="{StaticResource AllGreenIconTemplate}"/>
于 2016-04-12T10:02:24.480 に答える
0

私は試行錯誤によって解決策を見つけることができました。ContentControl基本的には、 s をsに置き換えて、 sRectangleのスタイルを作成しましたRectangle

<LinearGradientBrush x:Key="GreenLinearGradientBrush" EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
    <GradientStop Color="#FF00BD22" Offset="1"/>
    <GradientStop Color="#FF218934"/>
</LinearGradientBrush>

<Style x:Key="GreenRectangleStyle" TargetType="{x:Type Rectangle}">
   <Setter Property="Width" Value="16"/>
   <Setter Property="Height" Value="16"/>
   <Setter Property="Fill" Value="{StaticResource GreenLinearGradientBrush}"/>
   <Setter Property="Effect" Value="{StaticResource IconDropShadowEffect}"/>
</Style>

<Grid x:Key="AllGreenIcon" Height="16" Width="16" Effect="{StaticResource IconDropShadowEffect}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Rectangle Margin="0,0,1,1" Grid.Row="0" Grid.Column="0" Style="{StaticResource GreenRectangleStyle}"/>
    <Rectangle Margin="1,0,0,1" Grid.Row="0" Grid.Column="1" Style="{StaticResource GreenRectangleStyle}"/>
    <Rectangle Margin="0,1,1,0" Grid.Row="1" Grid.Column="0" Style="{StaticResource GreenRectangleStyle}"/>
    <Rectangle Margin="1,1,0,0" Grid.Row="1" Grid.Column="1" Style="{StaticResource GreenRectangleStyle}"/>
</Grid>

誰かがより良い解決策を持っていますか?

編集:

@Novitchi Sは、彼の答えに基づいて、より良い解決策を持っていました。最終バージョンは次のとおりです。

<Style x:Key="GreenRectangleStyle" TargetType="{x:Type Rectangle}">
    <Setter Property="Width" Value="16"/>
    <Setter Property="Height" Value="16"/>
    <Setter Property="Fill" Value="{StaticResource GreenLinearGradientBrush}"/>
    <Setter Property="Effect" Value="{StaticResource IconDropShadowEffect}"/>
</Style>

<DataTemplate x:Key="GreenRectangle">
    <Rectangle  Style="{StaticResource GreenRectangleStyle}"/>
</DataTemplate>

<DataTemplate x:Key="AllGreenIcon">
    <Grid  Height="16" Width="16" Effect="{StaticResource IconDropShadowEffect}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <ContentControl ContentTemplate="{StaticResource GreenRectangle}" Margin="0,0,1,1" Grid.Row="0" Grid.Column="0"/>
        <ContentControl ContentTemplate="{StaticResource GreenRectangle}" Margin="1,0,0,1" Grid.Row="0" Grid.Column="1"/>
        <ContentControl ContentTemplate="{StaticResource GreenRectangle}" Margin="0,1,1,0" Grid.Row="1" Grid.Column="0"/>
        <ContentControl ContentTemplate="{StaticResource GreenRectangle}" Margin="1,1,0,0" Grid.Row="1" Grid.Column="1"/>
    </Grid>
</DataTemplate>

. . .

<ToolBar>
    <Button ContentTemplate="{StaticResource AllGreenIcon}"/>
    <Button ContentTemplate="{StaticResource AllRedIcon}"/>
    <Button ContentTemplate="{StaticResource RedRectangle}"/>
    <Button ContentTemplate="{StaticResource GreenRectangle}"/>
</ToolBar>
于 2016-04-12T07:47:10.040 に答える