2016-04-11 33 views
4

Bir Windows Forms formunda barındırılan bir UserControl sahibim. Bu UserControl ben Çeşitli düğmeleri bir ToolBar var:Düğmeler özel içerik çalışma zamanında görüntülenmiyor

O Desinger içinde şuna benzer
<ToolBar> 
    <Button Content="{StaticResource AllGreenIcon}"/> 
    <Button Content="{StaticResource AllRedIcon}"/> 
    <Button Content="{StaticResource RedRectangle}"/> 
    <Button Content="{StaticResource GreenRectangle}"/> 
</ToolBar> 

:

Toolbar with buttons in Designer mode

sorun simgesi 4'ün yapılır düğmelerle olduğunu dikdörtgenler. İçerik, çalışma zamanında bu iki düğme için oluşturulmuyor.

Çalışma zamanında şuna benzer:

Toolbar at runtime

kod AllGreenIcon için:

<UserControl.Resources> 

<Grid x:Key="AllGreenIcon" Height="16" Width="16" Effect="{StaticResource IconDropShadowEffect}"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <ContentControl Content="{StaticResource GreenRectangle}" Margin="0,0,1,1" Grid.Row="0" Grid.Column="0"/> 
    <ContentControl Content="{StaticResource GreenRectangle}" Margin="1,0,0,1" Grid.Row="0" Grid.Column="1"/> 
    <ContentControl Content="{StaticResource GreenRectangle}" Margin="0,1,1,0" Grid.Row="1" Grid.Column="0"/> 
    <ContentControl Content="{StaticResource GreenRectangle}" Margin="1,1,0,0" Grid.Row="1" Grid.Column="1"/> 
</Grid> 


</UserControl.Resources> 

kimse bunu düzeltmek nasıl bazı fikirler var mı? Şimdiden teşekkürler!

+0

Izgara bir kap, bir ContentControl olup. Grid'i bir ContentControl içine sarmayı deneyin ve ContentControl öğesini doğrudan Grid isminin yerine 'AllGreenIcon' tuşuyla adlandırın. – kennyzx

+0

@kennyzx Önerinizi denedim, ancak işe yaramadı, sonuç aynı. – Cika012

cevap

1

Bu ortak sorun WPF kaynaklanmaktadır her UIElement (mantıksal) gereksinimi tek ebeveyn olması. Durumunuza bir eleman ekliyorsunuz - GreenRectangle ve sonra bu öğeyi, AllGreenIcon kaynağınızda birden çok ContentControl s için Content olarak kullanıyorsunuz. Görsel bir ağaca bir eleman her bağlandığında, üst referansını değiştirecektir, bu, bir öğenin görsel ağaçta sadece bir kez bulunduğunu garanti eder. Tüm yeşil düğmeler örneğin GreenRectangle öğesinin aynı örneğini kullanacaktır. GreenRectangle her seferinde görsel ağacına bağlandığından, üst öğesi yalnızca son öğeyi değiştirerek GreenRectange kaynağını kullanarak öğeyi gerçekten görüntüler. Sonuç olarak, kaynaklarda UIElements bildirimini kullanmak ve kullanmaktan kaçının. Style s ve Controltemplate s kullanmalısınız.

Not: çözümü aynı sorun var olacaktır kaynaklarda bildirilen AllGreenIcon ızgara içinde - Aynı anda arayüzünde iki farklı yerde kullanılamaz. Bunun yerine bir ContentTemplate kullanın.

Örnek:

<Button ContentTemplate="{StaticResource AllGreenIconTemplate}"/> 
+0

Bana bunu hatırlattığın için teşekkür ederim, bu tek ebeveynli kural ile daha önce sorunlarım vardı. Sadece unuttum. Cevabınıza dayanarak 'Izgaralar' bir DataTemplate ile sardım ve bunu 'Button 'ContentTemplate' olarak ayarladım. Teşekkür ederim! – Cika012

0

Deneme ve hatayla ilgili bir yanılmayı bulmayı başardım. Temelde yaptığım şey, ContentControl s'yi Rectangle s ile değiştirdim ve Rectangle s için bir stil oluşturdum.

<LinearGradientBrush x:Key="GreenLinearGradientBrush" EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0"> 
    <GradientStop Color="#FF00BD22" Offset="1"/> 
    <GradientStop Color="#FF218934"/> 
</LinearGradientBrush> 

<Style x:Key="GreenRectangleStyle" TargetType="{x:Type Rectangle}"> 
    <Setter Property="Width" Value="16"/> 
    <Setter Property="Height" Value="16"/> 
    <Setter Property="Fill" Value="{StaticResource GreenLinearGradientBrush}"/> 
    <Setter Property="Effect" Value="{StaticResource IconDropShadowEffect}"/> 
</Style> 

<Grid x:Key="AllGreenIcon" Height="16" Width="16" Effect="{StaticResource IconDropShadowEffect}"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <Rectangle Margin="0,0,1,1" Grid.Row="0" Grid.Column="0" Style="{StaticResource GreenRectangleStyle}"/> 
    <Rectangle Margin="1,0,0,1" Grid.Row="0" Grid.Column="1" Style="{StaticResource GreenRectangleStyle}"/> 
    <Rectangle Margin="0,1,1,0" Grid.Row="1" Grid.Column="0" Style="{StaticResource GreenRectangleStyle}"/> 
    <Rectangle Margin="1,1,0,0" Grid.Row="1" Grid.Column="1" Style="{StaticResource GreenRectangleStyle}"/> 
</Grid> 

Daha iyi bir çözümü olan var mı?

düzenleme:

<Style x:Key="GreenRectangleStyle" TargetType="{x:Type Rectangle}"> 
    <Setter Property="Width" Value="16"/> 
    <Setter Property="Height" Value="16"/> 
    <Setter Property="Fill" Value="{StaticResource GreenLinearGradientBrush}"/> 
    <Setter Property="Effect" Value="{StaticResource IconDropShadowEffect}"/> 
</Style> 

<DataTemplate x:Key="GreenRectangle"> 
    <Rectangle Style="{StaticResource GreenRectangleStyle}"/> 
</DataTemplate> 

<DataTemplate x:Key="AllGreenIcon"> 
    <Grid Height="16" Width="16" Effect="{StaticResource IconDropShadowEffect}"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <ContentControl ContentTemplate="{StaticResource GreenRectangle}" Margin="0,0,1,1" Grid.Row="0" Grid.Column="0"/> 
     <ContentControl ContentTemplate="{StaticResource GreenRectangle}" Margin="1,0,0,1" Grid.Row="0" Grid.Column="1"/> 
     <ContentControl ContentTemplate="{StaticResource GreenRectangle}" Margin="0,1,1,0" Grid.Row="1" Grid.Column="0"/> 
     <ContentControl ContentTemplate="{StaticResource GreenRectangle}" Margin="1,1,0,0" Grid.Row="1" Grid.Column="1"/> 
    </Grid> 
</DataTemplate> 

: @Novitchi S burada yaptığı Yanıta göre daha iyi bir çözüm vardı

son sürümüdür. . .

<ToolBar> 
    <Button ContentTemplate="{StaticResource AllGreenIcon}"/> 
    <Button ContentTemplate="{StaticResource AllRedIcon}"/> 
    <Button ContentTemplate="{StaticResource RedRectangle}"/> 
    <Button ContentTemplate="{StaticResource GreenRectangle}"/> 
</ToolBar> 
İlgili konular