2013-03-07 15 views
11

Uygulamamdaki farklı öğelere başvuran çok sayıda TextBlock var. Kodum doğrudan sayfada kullanıldığında iyi çalışıyor. Bununla birlikte, kodun çoğaltılmasını azaltmak için bir ControlTemplate ve bir ContentControl oluşturmak istiyorum.ControlTemplate içinde bir ElementName bağını nasıl kullanabilirim?

TemplateBinding kullanarak ContentControl'den ControlTemplate'e bir ElementName öğesine nasıl başvuruda bulunabilirim? Ayrıca işe yaramadı

"Cannot convert the value in attribute 'ElementName' to object of type 'System.String'. Object of type 'System.Windows.TemplateBindingExpression' cannot be converted to type 'System.String'. "

Etiket özelliğine ek olarak, ben denedim ContentStringFormat: Aşağıdaki kod bu hatayı atar.

Şablonları kullanarak çalışmaya başlamak için doğru yöntem nedir? Yardımlarınız için şimdiden

sayesinde

--- Shawn İşte

kodu bir örnektir:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 
    <Page.Resources> 
     <ControlTemplate x:Key="MyTemplate" TargetType="{x:Type ContentControl}"> 
      <TextBlock Margin="{Binding ElementName={TemplateBinding Tag}, Path=Margin}" Text="{TemplateBinding Content}" TextAlignment="{Binding ElementName={TemplateBinding Tag}, Path=TextAlignment}" Width="{Binding ElementName={TemplateBinding Tag}, Path=Width}" /> 
     </ControlTemplate> 
    </Page.Resources> 
    <StackPanel> 
     <TextBlock x:Name="AnotherElement" Margin="10" Text="Main TextBlock" TextAlignment="Center" Width="100" /> 
     <TextBlock x:Name="AnotherElement2" Margin="20" Text="Second TextBlock" TextAlignment="Left" Width="250" /> 
     <TextBlock Margin="{Binding ElementName=AnotherElement, Path=Margin}" Text="Here is my TextBlock!" TextAlignment="{Binding ElementName=AnotherElement, Path=TextAlignment}" TextTrimming="CharacterEllipsis" Width="{Binding ElementName=AnotherElement, Path=Width}" /> 
     <TextBlock Margin="{Binding ElementName=AnotherElement2, Path=Margin}" Text="Here is my Second TextBlock!" TextAlignment="{Binding ElementName=AnotherElement2, Path=TextAlignment}" TextTrimming="CharacterEllipsis" Width="{Binding ElementName=AnotherElement2, Path=Width}" /> 
     <ContentControl Content="Hello!" Tag="AnotherElement" Template="{StaticResource MyTemplate}" /> 
     <ContentControl Content="Hello Again!" Tag="AnotherElement2" Template="{StaticResource MyTemplate}" /> 
    </StackPanel> 
</Page> 
+1

Neden stil oluşturmuyor ve bunları bu stile gereksinim duyan tüm denetimlere uygulamıyorsunuz? Neden bazı özellikleri bir kontrolde tanımlamak ve diğer kontrolleri ona bağlamak istersiniz? Bu en iyi ihtimalle garip geliyor. Tag özelliğinde –

+0

@Brent Depolama Bilgileri, MS Access form geliştirme ile bir tekniktir. Kontrolünüzde bazı özellik/işleyicilere bağlı bir VBA işlevine bazı sabit kodlanmış değerleri iletmek ucuz ve kötü bir yoldu. WPF'de buna ihtiyacımız yok çünkü elimizdeki daha geniş bir araç yelpazemiz var =) – failedprogramming

+0

@BrentStewart Bu uygulamanın sonucunu MVVM, Bindings, DataTemplates, vb. Kullanarak sütunlarda görüntülemekteyim. Örneğimi özellikle ölçeklendirdim Bu siteyi sormak için. Grid kullanmamayı tercih ettim ve bunun yerine bir WrapPanel kullanıyorum çünkü kullanımı daha kolay ve temiz olduğunu hissettim. Bir TextBlock'un bir çok özelliğini bir diğerine bağlıyorum çünkü sütun başlığımın kendi özel başlığı için belirttiğim özellikleri (kenar boşluğu, genişlik, hizalama, vb.) Kopyalamasını istiyorum. Her bir metin bloğu için farklı bir öğe adına başvurduğunda bu stili nasıl uygularsınız? Bunun bir denetim şablonunun iyi bir yolu olmadığını belirtmek için –

cevap

23

Bu şey şablon için komik bir yol gibi görünüyor, ama olabilir bitti, sadece bağlarınızla biraz süslü olsun.

aşağıda çalışacaktır, ama yine de bu bir denetim

Bind şablon için iyi bir yol olduğunu sanmıyorum TextBlockTag fiili Unsuru, sonra ControlTemplate gelmediğini TagTag ve oradan değerleri kullanın Etiket Element olarak, herhangi bir elemanı kullanabilirsiniz.

<Page.Resources> 
    <ControlTemplate x:Key="MyTemplate" TargetType="{x:Type ContentControl}"> 
     <TextBlock Name="_this" Tag="{TemplateBinding Tag}" Margin="{Binding ElementName=_this, Path=Tag.Margin}" Text="{TemplateBinding Content}" TextAlignment="{Binding ElementName=_this, Path=Tag.TextAlignment}" Width="{Binding ElementName=_this, Path=Tag.Width}" /> 
    </ControlTemplate> 
</Page.Resources> 
<StackPanel> 
    <TextBlock x:Name="AnotherElement" Margin="10" Text="Main TextBlock" TextAlignment="Center" Width="100" /> 
    <TextBlock x:Name="AnotherElement2" Margin="20" Text="Second TextBlock" TextAlignment="Left" Width="250" /> 
    <TextBlock Margin="{Binding ElementName=AnotherElement, Path=Margin}" Text="Here is my TextBlock!" TextAlignment="{Binding ElementName=AnotherElement, Path=TextAlignment}" TextTrimming="CharacterEllipsis" Width="{Binding ElementName=AnotherElement, Path=Width}" /> 
    <TextBlock Margin="{Binding ElementName=AnotherElement2, Path=Margin}" Text="Here is my Second TextBlock!" TextAlignment="{Binding ElementName=AnotherElement2, Path=TextAlignment}" TextTrimming="CharacterEllipsis" Width="{Binding ElementName=AnotherElement2, Path=Width}" /> 
    <ContentControl Content="Hello!" Tag="{Binding ElementName=AnotherElement}" Template="{StaticResource MyTemplate}" /> 
    <ContentControl Content="Hello Again!" Tag="{Binding ElementName=AnotherElement2}" Template="{StaticResource MyTemplate}" /> 
</StackPanel> 
+2

+1. –

+14

Cevabınız için teşekkür ederiz. Bu benim uygulamada istediğim gibi çalışır. Hem siz hem de @BrentStewart, bunun bir kontrol şablonu için iyi bir yol olmadığını belirtiyor. Seçenek olarak, iyi bir yol nedir ve neden bu bir değildir? –

+3

Evet, hiçbir alternatif yoktur, bu yüzden "bunu yapmak için iyi bir yol değil" diyerek aptalca. Açıkçası, ama başka seçenekler nelerdir? Görsel ağacın tasarlanma şekli nedeniyle, bu tür bir kısıtlama çok sık gelir. – user99999991

İlgili konular