3

私はWPFを初めて使用するので、これはばかげた質問かもしれませんが、ここにあります。
XAMLのものを使用してカスタムボタンを作成しようとしているので、これが私が持っているものです:

<Button x:Class="Controls.ShinyButton"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" Height="40" Width="150">
    <Button.Resources>
        <ResourceDictionary Source=".\Resources.xaml" />
    </Button.Resources>

    <Border Background="{StaticResource BlueGradient}" CornerRadius="5">
        <DockPanel>
            <Image x:Name="imgIcon" DockPanel.Dock="Left" Height="32" Margin="4"/>
            <TextBlock DockPanel.Dock="Right" Text ="Test" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="White" />
        </DockPanel>
    </Border>

    <Button.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="#FF02B6FF" Offset="0" />
            <GradientStop Color="#FF0084F0" Offset="1" />
        </LinearGradientBrush>
    </Button.Background>
 </Button>

デザイナはそれを理解し、エラーなしでコンパイルしますが、プログラムを実行してそのインスタンスを作成しようとすると、
「ContentControlのコンテンツは単一の要素である必要があります」というエラーが発生します。

私のリソースファイルは次のとおりです。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <LinearGradientBrush x:Key="BlueGradient">
        <GradientStop Offset="0" Color="#FF02B6FF"/>
        <!-- (2, 182, 255)-->
        <GradientStop Offset="1" Color="#FF0084F0"/>
        <!-- (0, 132, 240) -->
    </LinearGradientBrush>

</ResourceDictionary>

Border内にDockPanelがあるので、ボタンには子が1つだけあります...
「ShinyButton」クラスは次のようになります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Controls
{
    /// <summary>
    /// Interaction logic for ShinyButton.xaml
    /// </summary>
    public partial class ShinyButton : Button
    {
        public ShinyButton()
        {
            InitializeComponent();
        }
    }
}

main関数で、次のように追加します。

public MainWindow()
        {
            InitializeComponent();

            ShinyButton shiny = new ShinyButton();
            this.AddChild(shiny); //This is where the exception is thrown.

        }

私は何が間違っているのですか?

4

2 に答える 2

7

推測とATMだけではテストできませんが、次のコードを試してください。

<Button.Template>
    <ControlTemplate>
        <Border Background="{StaticResource BlueGradient}" CornerRadius="5">
            <DockPanel>
                <Image x:Name="imgIcon" DockPanel.Dock="Left" Height="32" Margin="4"/>
                <TextBlock DockPanel.Dock="Right" Text ="Test" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="White" />
            </DockPanel>
        </Border>
    </ControlTemplate>
</Button.Template>

編集:OK次の試行:

ShinyButtonをウィンドウに追加する(this.AddChild(shiny)を削除する)代わりに、次のコードを追加して、ShinyButtonをグリッドに追加してみてください。

NameOfGrid.Children.Add(shiny);

このエラーの理由は、ウィンドウに1つの子しか持てないためです。あなたの場合、この子としてすでにグリッドが存在しているに違いありません。

于 2012-09-26T20:38:11.713 に答える
1

コードを試してみたところ、いくつかの注意点がありますが、正常に機能します。

それを機能させるために、私はそのファイルを持っていないので、resouceDictionaryリンクを削除する必要がありました。スタイル/テンプレートなどだけでなく、一部のコンテンツが定義されている可能性はありますか?

また、コードにx:Class = "ShinyButton"が含まれていることにも注意してください。コードと、xamlで定義されているコンテンツはありますか?

于 2012-09-26T20:44:20.577 に答える