WPF kullanıcı denetiminde içe aktarılan ve yerel kaynaklar nasıl birleştirilir


82

Hem paylaşılan hem de bireysel kaynaklara ihtiyaç duyan birkaç WPF kullanıcı denetimi yazıyorum.

Kaynakları ayrı bir kaynak dosyasından yüklemek için sözdizimini buldum:

<UserControl.Resources>
    <ResourceDictionary Source="ViewResources.xaml" />
</UserControl.Resources>

Ancak, bunu yaptığımda yerel olarak da kaynak ekleyemiyorum, örneğin:

<UserControl.Resources>
    <ResourceDictionary Source="ViewResources.xaml" />
    <!-- Doesn't work: -->
    <ControlTemplate x:Key="validationTemplate">
        ...
    </ControlTemplate>
    <style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
        ...
    </style>
    ...
</UserControl.Resources>

ResourceDictionary.MergedDictionaries'e bir göz attım, ancak bu yalnızca birden fazla harici sözlüğü birleştirmeme izin veriyor, yerel olarak daha fazla kaynak tanımlamama izin vermiyor.

Önemsiz bir şeyi kaçırıyor olmalıyım?

Şunu belirtmek gerekir: Kullanıcı kontrollerimi bir WinForms projesinde barındırıyorum, bu nedenle paylaşılan kaynakları App.xaml'ye koymak gerçekten bir seçenek değil.

Yanıtlar:


157

Bunu anladım. Çözüm MergedDictionaries'i içeriyor, ancak ayrıntılar tam olarak doğru olmalı, şöyle:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- This works: -->
        <ControlTemplate x:Key="validationTemplate">
            ...
        </ControlTemplate>
        <style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
            ...
        </style>
        ...
    </ResourceDictionary>
</UserControl.Resources>

Diğer bir deyişle, yerel kaynaklar ResourceDictionary etiketi içinde yuvalanmalıdır . Yani örnek burada yanlıştır.


5

MergedDictionaries bölümünde yerel kaynakları tanımlayabilirsiniz:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <!-- import resources from external files -->
            <ResourceDictionary Source="ViewResources.xaml" />

            <ResourceDictionary>
                <!-- put local resources here -->
                <Style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
                    ...
                </Style>
                ...
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

5

Birleştirilmiş Sözlükleri kullanın .

Aşağıdaki örneği buradan aldım .

Dosya1

<ResourceDictionary 
  xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation "
  xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml " > 
  <Style TargetType="{x:Type TextBlock}" x:Key="TextStyle">
    <Setter Property="FontFamily" Value="Lucida Sans" />
    <Setter Property="FontSize" Value="22" />
    <Setter Property="Foreground" Value="#58290A" />
  </Style>
</ResourceDictionary>

Dosya 2

   <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="TextStyle.xaml" />
        </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary> 

Teşekkürler ama şans yok. Örneği doğru görünüyor ama aslında işe yaramıyor. "'Kaynaklar' özelliği birden fazla ayarlandı" mesajını alıyorum.
Tor Haugen

MergedDictionaries'i biliyorum. Ancak harici bir sözlük referansını yerel olarak tanımlanmış kaynaklarla istediğim şekilde birleştirmeme izin vermiyorlar. Daha önce de belirtildiği gibi, atıfta bulunduğunuz sayfada bir örnek var ama işe yaramıyor.
Tor Haugen

2
Bu "birden fazla ayarla" hatasını alan herkes için: Diğer tüm kaynakların ilk <ResourceDictionary> etiketi içinde olması gerekir.
Hexo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.