この奇妙な現象を見つけたとき、私は 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 に報告すべきバグですか?