1

プログラムの1つで使用しているいくつかのToggleButton要素に対して、いくつかのスタイルとテンプレートを定義する必要があることに気付きました。コンテンツとして設定したものが表示されないことを除いて、すべてが機能しています。コンテンツを正しく表示する方法がわかりません。私のコードは次のとおりです。

    private Style m_ToggleStyle;
    private Style ToggleStyle
    {
        get
        {
            if (m_ToggleStyle == null)
            {
                lock (new object())
                {
                    if (m_ToggleStyle == null)
                    {
                        m_ToggleStyle = new Style(typeof(ToggleButton));

                        m_ToggleStyle.Setters.Add(new Setter { Property = ToggleButton.TemplateProperty, Value = ToggleTemplate });
                    }
                }
            }
            return m_ToggleStyle;
        }
    }

    private ControlTemplate m_ToggleTemplate;
    private ControlTemplate ToggleTemplate
    {
        get
        {
            if (m_ToggleTemplate == null)
            {
                lock (new object())
                {
                    if (m_ToggleTemplate == null)
                    {
                        m_ToggleTemplate = new ControlTemplate();
                        FrameworkElementFactory g = new FrameworkElementFactory(typeof(Grid));
                        g.SetValue(Grid.MarginProperty, new Thickness(0));
                        g.Name = "MainGrid";

                        FrameworkElementFactory cp = new FrameworkElementFactory(typeof(ContentPresenter));
                        cp.SetValue(ContentPresenter.NameProperty, "Contents");
                        cp.SetValue(ContentPresenter.HorizontalAlignmentProperty, System.Windows.HorizontalAlignment.Stretch);
                        cp.SetValue(ContentPresenter.VerticalAlignmentProperty, System.Windows.VerticalAlignment.Stretch);
                        cp.SetValue(ContentPresenter.MarginProperty, new Thickness(2));
                        cp.Name = "Contents";

                        g.AppendChild(cp);
                        m_ToggleTemplate.VisualTree = g;

                        ImageBrush ibBackgroundUnselected = new ImageBrush();
                        ibBackgroundUnselected.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Controls;component/Resources/TabUnselected.png", UriKind.Absolute));
                        g.SetValue(Grid.BackgroundProperty, ibBackgroundUnselected);

                        ImageBrush ibBackgroundSelected = new ImageBrush();
                        ibBackgroundSelected.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Controls;component/Resources/TabSelected.png", UriKind.Absolute));

                        Trigger tIsChecked = new Trigger { Property = ToggleButton.IsCheckedProperty, Value = true };
                        tIsChecked.Setters.Add(new Setter(Grid.BackgroundProperty, ibBackgroundSelected, "MainGrid"));

                        m_ToggleTemplate.Triggers.Add(tIsChecked);

                    }
                }
            }
            return m_ToggleTemplate;
        }
    }

これは、次のようなToggleButtonを動的に作成するときに使用されます。

ToggleButton tbExample = new ToggleButton();
tbExample.Style = ToggleStyle;
tbExample.Content = "Content";
4

3 に答える 3

4

VisualTreeofを割り当てる行が表示されませんm_ToggleTemplate。次の行があります。

m_LocationSelectionTemplate.VisualTree = g;

しかし、ToggleTemplateアクセサーのどこにも実際に の有効な値を設定していませんm_ToggleTemplate

他に注意すべきことは、の使用ですFrameworkElementFactoryMSDNによると、これはコントロール テンプレートを作成する最良の方法ではなく、実際には推奨されていません。

このクラスは、ControlTemplate や DataTemplate などの FrameworkTemplate のサブクラスであるテンプレートをプログラムで作成する非推奨の方法です。このクラスを使用してテンプレートを作成する場合、すべてのテンプレート機能を使用できるわけではありません。テンプレートをプログラムで作成するための推奨される方法は、XamlReader クラスの Load メソッドを使用して、文字列またはメモリ ストリームから XAML を読み込むことです。

于 2011-06-15T23:07:30.220 に答える
0
FrameworkElementFactory cp = new FrameworkElementFactory(typeof(ContentPresenter));
cp.SetValue(ContentPresenter.NameProperty, "Contents");

// try adding this line
cp.SetValue(ContentPresenter.ContentSourceProperty, "Content");
于 2011-06-16T14:46:22.533 に答える
0

問題が見つかりました:

m_ToggleTemplate = new ControlTemplate();

になるはずだった:

m_ToggleTemplate = new ControlTemplate(typeof(ToggleButton));

ControlTemplate のタイプを設定しないと、部分的にしか機能しないようです。

于 2011-06-16T15:40:44.330 に答える