1

この質問にはおそらく「重複した質問」のコメントがたくさん寄せられることはわかっていますが、機能する、または単純に「絶対に避けてください」ではない回答をまだ見たことがありません。しかし、ここでは、「ControlA_Project」というプロジェクトで「ControlA」と呼ぶコントロールを作成しました。「ControlA」という別のプロジェクトで「ControlA」を継承する「ControlB」というコントロールで、その仮想メソッドの一部をオーバーライドするつもりでした。 ControlB_Project" . 「ControlA」には、ファイルへの保存と読み込みから変更したい保存と読み込みメソッドがあり、データベースへの保存と読み込みも必要です(後で別の保存と読み込みタイプが必要な場合は、それらのメソッドを再度オーバーライドできます) . 私が抱えている問題は、もともと「ControlA」を持っていたことです

コンポーネント 'ControlB_Project.ControlB' には、URI '/ControlA_Project;component/usercontrols/ControlA.xaml' で識別されるリソースがありません。

エラーをグーグルで検索すると、ユーザーコントロールから継承できないという結論に達しました(または、議論のために、それは良い考えではありませんでした)。そこで、コントロールをユーザー コントロールからカスタム コントロールに変更しました。ただし、これは別の問題につながります.コントロールのテンプレートは、ユーザーコントロールのようにコードビハインド(つまりOn_Click)にリンクせず、ビヘイビアーを単純にオーバーライドする簡単な方法はありません(私の知る限り) . ControlAsテンプレートをコピーして貼り付け、数行を変更することでControlBを再テンプレート化できることはわかっていますが、controlAにはそのまま大きなテンプレートがあり、複数のコピーを作成するとスペースが無駄になります。簡単に言えば、wpfでコントロールの動作を変更する正しい方法はありますか?

4

1 に答える 1

2

まず、ControlTemplate はユーザーが頻繁に変更できるため、重要なフィールドが明確にマークされていることを確認する必要があることに注意してください。したがって、OnClick イベントが必要な場合。まず、ボタンを「重要」としてマークします

<Button x:Name="PART_MyButton"/>

これもコントロールクラスにマークすることをお勧めします

[TemplatePart(Name = "PART_MyButton", Type = typeof(Button))]
public class MyCustomControl : Control

これを行うには、そのボタンのクリック イベントにアタッチし、OnApplyTemplateメソッドをオーバーライドします。

public override void OnApplyTemplate()
{
    mButton = Template.FindName("PART_MyButton", this) as Button;
    mButton.Click += MyEventHandler;
}

コントロールがなくてもコントロールがどれだけうまく機能するかに応じて、見つからないコントロールを適切に処理するか、例外をスローする必要があります。

最後に 1 つ。既定のスタイルを持つコントロールをオーバーライドする場合は、新しい既定のスタイルを提供することをお勧めします。

static MyCustomControl()
{
    DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl)));
}

暗黙のスタイルをあなたのgeneric.xaml

于 2012-08-03T14:24:22.550 に答える