1

この奇妙な現象を見つけたとき、私は UserControl を作成していました。C# コードを使用して GroupBox を UserControl のテンプレートに配置し、GroupBox で SetResourceReference 呼び出しを行うと、突然、GroupBox が TemplateParent (私の UserControl) のフォアグラウンドを継承します。

これまでのところ、この状況では次の要件が見つかりました。

  • UserControl の基本型は関係ありません
  • 影響を受けるテンプレートの子は GroupBox である必要があります (ただし、最初のテンプレートの子である必要はありません)
  • GroupBox の前景は、継承をオーバーライドして、テンプレートで明示的に設定できます。
  • GroupBox から何らかの参照呼び出しを使用している必要があります
  • Foreground プロパティのみが影響を受けるようです

ここに私のサンプルコードがあります:

MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="350">
    <Window.Resources>
        <Thickness x:Key="TestPadding">5</Thickness>
        <Style TargetType="{x:Type GroupBox}">
            <Setter Property="Foreground" Value="Red" />
            <Setter Property="Background" Value="Orange" />
        </Style>
    </Window.Resources>
    <Grid>
        <my:TestControl Foreground="Blue" Background="Purple" />
    </Grid>
</Window>

TestControl.cs:

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Media.Effects;
using System.Windows.Markup;

namespace WpfApplication1
{
    public class TestControl : UserControl
    {
        public TestControl()
        {
            FrameworkElementFactory group = new FrameworkElementFactory(typeof(GroupBox));
            group.SetValue(GroupBox.ContentProperty, "My Child");
            group.SetResourceReference(GroupBox.MarginProperty, "TestPadding");
            this.SetValue(TestControl.TemplateProperty, new ControlTemplate(typeof(TestControl)) { VisualTree = group });
        }
    }
}


皆さんはどう思いますか、これは Microsoft に報告すべきバグですか?

4

2 に答える 2

0

マイクロソフトの問題ではないと思います。実際、うまく機能していると思います。TestControl のコード ビハインドで Templeate を定義し、GroupBox をテンプレートのルート要素として設定しています。ここで何が起こるかというと、UserControl.Foreground プロパティがテンプレートのルートである GroupBox と同じではないため、GroupBox (GroupBox として) はリソース (この場合は Window のリソース) から継承する Foreground を取得します。

これを解決したい場合は、「TemplateBindings」などを実行できます。次のコードは TemplateBinding のように機能します。

namespace WpfApplication1
{
    public class TestControl : UserControl
    {
        public TestControl()
        {
            FrameworkElementFactory group = new FrameworkElementFactory(typeof(GroupBox));
            group.SetValue(GroupBox.ContentProperty, "My Child");
            group.SetResourceReference(GroupBox.MarginProperty, "TestPadding");

            //This line will work as a TeplateBinding
            group.SetBinding(GroupBox.ForegroundProperty, new Binding() { Path = new PropertyPath("Foreground"), RelativeSource = RelativeSource.TemplatedParent });

            this.SetValue(TestControl.TemplateProperty, new ControlTemplate(typeof(TestControl)) { VisualTree = group });
        }
    }
}

この回答がお役に立てば幸いです。

于 2012-10-16T12:31:35.853 に答える
0

Microsoft WPF 開発チームに連絡しました。彼らはこれをバグとして認めていますが、優先度は低く、修正される可能性は低いとしています。

この例の回避策: GroupBox の代わりに、別のコントロールを使用して *.SetResourceReference 呼び出しを実行し、パディングを実行します。

于 2012-10-21T19:25:13.753 に答える