65195


WPFでButtonをラップしたカスタムコントロールの作成を試しています。  
今のところは以下2つの依存プロパティを定義したのみの簡単なものです。  
①MouseOverBackground (マウスオーバー時のBrush)  
②MouseDownBackground (マウスクリック時のBrush)

FlatButton.cs

[code]

        public class FlatButton : Button
        {
            static FlatButton()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(FlatButton), new FrameworkPropertyMetadata(typeof(FlatButton)));
            }
    
            public static readonly DependencyProperty MouseOverBackgroundProperty =
                DependencyProperty.Register(
                    "MouseOverBackground",
                    typeof(Brush),
                    typeof(FlatButton),
                    new PropertyMetadata(new SolidColorBrush(Colors.DarkGray)));
    
            public static readonly DependencyProperty MouseDownBackgroundProperty =
                DependencyProperty.Register(
                    "MouseDownBackground",
                    typeof(Brush),
                    typeof(FlatButton),
                    new PropertyMetadata(new SolidColorBrush(Colors.LightGray)));
    
    
            public Brush MouseOverBackground
            {
                get => (Brush)GetValue(MouseOverBackgroundProperty);
                set => SetValue(MouseOverBackgroundProperty, value);
            }
    
            public Brush MouseDownBackground
            {
                get => (Brush)GetValue(MouseDownBackgroundProperty);
                set => SetValue(MouseDownBackgroundProperty, value);
            }
        }
    
[/code]

Xamlの定義は以下のようになっています。  
FlatButton.xaml

[code]

        <Style TargetType="{x:Type local:FlatButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:FlatButton}">
                        <Border x:Name="VisualBorder"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}">
                            <Border.Style>
                                <Style TargetType="Border">
                                    <Setter Property="Background" Value="{TemplateBinding Background}"/>
                                </Style>
                            </Border.Style>
    
                            <ContentPresenter Content="{TemplateBinding Content}"
                                              HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        </Border>
    
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter TargetName="VisualBorder" Property="Background" Value="{TemplateBinding MouseOverBackground}"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="true">
                                <Setter TargetName="VisualBorder" Property="Background" Value="{TemplateBinding MouseDownBackground}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    
[/code]

これでコンパイルを行ったところ、以下のエラーが発生しました。  
[ 修飾型名がないため、'Background' メンバーは無効です。 ]

[code]

    <Style TargetType="Border">
        <Setter Property="Background" Value="{TemplateBinding Background}"/>
    </Style>
    
[/code]

上の部分を削除するとコンパイルが通るのですが、エラーの内容が理解できません。  
どの様に修正が必要かご教示お願いします。


CC BY-SA 4.0
2020-03-29T02:37:22.047
65192
2020-03-29T07:47:06.783
2020-03-29T03:14:40.160
19110
38100
question
c# wpf
エラーの内容が理解できない：CustomControl - Button [修飾型名が無い為 メンバーは無効です]


エラーの意味は分からないのですが、`FlatButton.xaml`の`<Border
...>`と`</Border>`の間に`<Border.Style>...</Border.Style>`を定義しているのが問題なのでは？

その部分の初期値は以下のように既に`Background`は定義されているようです。

[code]

    <Border Background="{TemplateBinding Background}"
            BorderBrush="{TemplateBinding BorderBrush}"
            BorderThickness="{TemplateBinding BorderThickness}">
    
    </Border>
    
[/code]

質問のソースに合わせて、以下のように`x:Name="VisualBorder"`と`<ContentPresenter.../>`を追加すればビルドは通るのではないでしょうか？

[code]

    <Border x:Name="VisualBorder"
            Background="{TemplateBinding Background}"
            BorderBrush="{TemplateBinding BorderBrush}"
            BorderThickness="{TemplateBinding BorderThickness}">
        <ContentPresenter Content="{TemplateBinding Content}"
                          HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Border>
    
[/code]

* * *

ちなみにこんな記事もあるようです。  
[WPFのボタンをフラットデザインに変更する](https://takachan.hatenablog.com/entry/2017/12/27/000000)


CC BY-SA 4.0
2020-03-29T06:51:36.827
65195
2020-03-29T07:47:06.783
2020-03-29T07:47:06.783
26370
26370
65192
answer