質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

3303閲覧

コントールテンプレート内のカスタムシェーダエフェクトでXAMLバインドエラー

FoolHotari

総合スコア79

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2021/04/11 04:39

前提・実現したいこと

カスタムコントロール"Hoge"があり、"Hoge"には"Piyo"という依存関係プロパティがあります。
カスタムシェーダエフェクト"CustomShaderEffect"があり、"CustomShaderEffect"には"Fuga"という、ピクセルシェーダ定数と紐づけられた依存関係プロパティがあります。
"Hoge"のテンプレートには"CustomShaderEffect"を付けたBorderを入れており、"Fuga"には"Piyo"がバインドされています。
値は正常に反映され、ライブプロパティエクスプローラでもそれが確認できますが、バインドエラーが発生します。

動作には問題ありませんが、バインドエラーを消すにはどうすればいいのかご教授ください。

発生している問題・エラーメッセージ

XAMLバインドエラー

重大度レベルカウントデータ コンテキストバインド パスターゲットターゲット型説明
エラー1nullPiyoCustomShaderEffect.FugaDoubleターゲット要素の管理 FrameworkElement または FrameworkContentElement が見つかりません。

該当のソースコード

C#

1public class Hoge : Control 2{ 3 static Hoge() 4 { 5 DefaultStyleKeyProperty.OverrideMetadata(typeof(Hoge), new FrameworkPropertyMetadata(typeof(Hoge))); 6 } 7 8 #region == Piyo == 9 10 public static readonly DependencyProperty PiyoProperty = DependencyProperty.Register("Piyo", typeof(double), typeof(Hoge), new PropertyMetadata(0d)); 11 public double Piyo { get => (double)GetValue(PiyoProperty); set => SetValue(PiyoProperty, value); } 12 13 #endregion 14}

C#

1public class CustomShaderEffect : ShaderEffect 2{ 3 ... 4 5 #region == Fuga == 6 7 public static readonly DependencyProperty FugaProperty = DependencyProperty.Register("Fuga", typeof(double), typeof(CustomShaderEffect), new PropertyMetadata(0d, PixelShaderConstantCallback(0))); 8 public double Fuga { get => (double)GetValue(FugaProperty); set => SetValue(FugaProperty, value); } 9 10 #endregion 11}

XAML

1<ControlTemplate TargetType="{x:Type local:Hoge}"> 2 <Border Background="{TemplateBinding Background}" 3 BorderBrush="{TemplateBinding BorderBrush}" 4 BorderThickness="{TemplateBinding BorderThickness}"> 5 <Border.Effect> 6 <local:CustomShaderEffect Fuga="{Binding Piyo, RelativeSource={RelativeSource Mode=TemplatedParent}, Mode=OneWay}"/> 7 </Border.Effect> 8 </Border> 9</ControlTemplate>

試したこと

XAML

1<local:CustomShaderEffect Fuga="{Binding Piyo, RelativeSource={RelativeSource Mode=TemplatedParent}, Mode=OneWay}"/>

この部分を

XAML

1<local:CustomShaderEffect Fuga="{TemplateBinding Piyo}"/>

に変えるとバインドエラーは発生しなくなりますが、値が反映されなくなります。

補足情報(FW/ツールのバージョンなど)

Visual Studio Community 2019 16.9.3, .Net 5.0

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

動作には問題ありませんが、バインドエラーを消すにはどうすればいいのかご教授ください。

確かにそのようになりますね。

「動いてるならいいじゃん」という気もしますが、リソース経由でバインドすれば消えました(細かい理由は知りません)
wpf - ControlTemplate LayoutTransform Binding System.Windows.Data Error 2 or 4 - Stack Overflow

面倒なのでDropShadowEffectで済ませましたが、おそらく同様かと思います。

xml

1<ResourceDictionary 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:local="clr-namespace:Questions332649"> 5 6 <Style TargetType="{x:Type local:Hoge}"> 7 <Setter Property="Template"> 8 <Setter.Value> 9 <ControlTemplate TargetType="{x:Type local:Hoge}"> 10 <Grid> 11 <Grid.Resources> 12 <DropShadowEffect x:Key="effect" ShadowDepth="{Binding Piyo, RelativeSource={RelativeSource TemplatedParent}}" /> 13 </Grid.Resources> 14 <Border 15 Background="{TemplateBinding Background}" 16 BorderBrush="{TemplateBinding BorderBrush}" 17 BorderThickness="{TemplateBinding BorderThickness}" 18 Effect="{StaticResource effect}"> 19 <Slider Maximum="100" Value="{Binding Piyo, RelativeSource={RelativeSource TemplatedParent}}" /> 20 </Border> 21 </Grid> 22 </ControlTemplate> 23 </Setter.Value> 24 </Setter> 25 </Style> 26</ResourceDictionary>

xml

1<Window 2 x:Class="Questions332649.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:local="clr-namespace:Questions332649" 6 Width="800" 7 Height="450"> 8 <StackPanel> 9 <local:Hoge 10 Margin="20" 11 BorderBrush="HotPink" 12 BorderThickness="10" /> 13 </StackPanel> 14</Window>

投稿2021/04/11 09:02

編集2023/07/26 15:49
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FoolHotari

2021/04/11 10:45

回答ありがとうございます。 リソース経由でバインドして解決することができました。 無駄なエラーがあると重要なエラーを見逃してしまいそうだったので、とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問