2016-10-19 4 views
1

Основываясь на приведенном ниже xaml, знает ли кто-нибудь, почему, если я создаю 2 (или более) кнопки (с неявными стилями), только 1 из них фактически отображает содержимое, однако все отображают синюю границу.Button Содержимое не всегда отображается

<Style TargetType="Button"> 

    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Button"> 
     <Border BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="1"> 
      <ContentPresenter Content="{TemplateBinding Content}"/> 
     </Border> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 

    <Setter Property="BorderBrush" Value="Blue"/> 

    <Setter Property="Content"> 
    <Setter.Value> 
     <Grid Background="Firebrick"/> 
    </Setter.Value> 
    </Setter> 

</Style> 

Проверка коды за все 3 кнопки имеет точно такое же содержание, но это только когда-либо отображается на 1 из них

if (a.Style == b.Style && a.Style == c.Style) 
{ 
    if (a.Content == b.Content && a.Content == c.Content) 
    { 
     // comes in here! 
    } 
} 

enter image description here

+2

всех 3 кнопок имеет точно такое же содержание, но UIElement не может принадлежать более чем одному из родителей, и поэтому отображается в последней кнопке. подумайте о том, чтобы сделать Grid частью шаблона – ASh

+2

Взгляните на четвертую марку в разделе «Примечания» в [ContentPresenter] (https://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter (v = vs.110) .aspx) в MSDN: * Если Content является объектом UIElement, отображается UIElement. Если у UIElement уже есть родитель, возникает исключение *. Однако, по-видимому, исключение не происходит, или оно ловутся внутри страны. – Clemens

+0

Очень разочаровывавший, подумал, что это может быть проблемой, но меня смутило, поскольку не было возбуждено никаких исключений. –

ответ

1

Проблема, как было упомянуто Clemens и золу Сетка в содержании не может иметь более чем на 1 родителя.

Обходным путем является использование DataTemplate и установка ContentTemplate элемента в качестве DataTemplate (как описано в приведенном ниже разделе).

Set a Button's content in style

0

Я уже сталкивался с этой проблемой с помощью кнопки изображений. Это связано с вашим стилем, где вы определили недвижимость Content, а не имущество Template. Установив свойство Content, вы не определяете ссылку на что-то, и вы не просите WPF создать новый объект для каждого элемента, то есть только последний элемент, созданный с помощью стиля, будет иметь значение Content.

Так что вы хотите сделать, либо установите свойство ContentTemplate, если вы планируете устанавливать контент для каждой кнопки. Или установите свойство Template, если вы действительно хотите изменить аспект Button.

Например со свойством Template:

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Button"> 
      <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1"> 
       <ContentPresenter Content="{TemplateBinding Content}" /> 
      </Border> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

<Setter Property="BorderBrush" Value="Blue" /> 

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <Grid Background="Firebrick" /> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

Смежные вопросы