Cách kết hợp tài nguyên đã nhập và tài nguyên cục bộ trong kiểm soát người dùng WPF


82

Tôi đang viết một số điều khiển người dùng WPF cần cả tài nguyên được chia sẻ và tài nguyên riêng lẻ.

Tôi đã tìm ra cú pháp để tải tài nguyên từ một tệp tài nguyên riêng biệt:

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

Tuy nhiên, khi thực hiện việc này, tôi cũng không thể thêm tài nguyên cục bộ, như:

<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>

Tôi đã xem qua ResourceDictionary.MergedDictionaries, nhưng điều đó chỉ cho phép tôi hợp nhất nhiều từ điển bên ngoài, không xác định thêm các tài nguyên cục bộ.

Tôi phải thiếu một cái gì đó tầm thường?

Cần lưu ý rằng: Tôi đang lưu trữ các điều khiển người dùng của mình trong một dự án WinForms, vì vậy việc đưa các tài nguyên được chia sẻ vào App.xaml không thực sự là một lựa chọn.

Câu trả lời:


157

Tôi đã hiểu rồi. Giải pháp liên quan đến MergedDictionaries, nhưng các chi tiết cụ thể phải vừa phải, như sau:

<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>

Nghĩa là, các tài nguyên cục bộ phải được lồng trong thẻ ResourceDictionary. Vì vậy, ví dụ ở đây là không chính xác.


5

Bạn có thể xác định tài nguyên cục bộ bên trong phần MergedDictionaries:

<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

Sử dụng MergedDictionaries .

Tôi lấy ví dụ sau đây từ đây.

File1

<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>

Tệp 2

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

Cảm ơn, nhưng không có may mắn. Ví dụ của anh ấy có vẻ đúng, nhưng không thực sự hiệu quả. Tôi nhận được thông báo "Thuộc tính 'Tài nguyên' được đặt nhiều lần".
Tor Haugen

Tôi biết về MergedDictionaries. Nhưng họ không cho phép tôi kết hợp tham chiếu từ điển bên ngoài với các tài nguyên được xác định cục bộ theo cách tôi muốn. Như đã nêu, có một ví dụ trên trang mà bạn tham khảo, nhưng nó không hoạt động.
Tor Haugen

2
Đối với bất kỳ ai gặp lỗi "đặt nhiều lần": Mọi tài nguyên khác cần phải nằm trong thẻ <ResourceDictionary> đầu tiên.
Hexo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.