2012-06-22 27 views
12

Tôi đã tạo một thư viện lớp học trong đó tôi đã tạo các điều khiển tùy chỉnh và tôi đã định nghĩa các kiểu mặc định trong tệp generic.xaml.Kiểu từ generic.xaml không được áp dụng

Có vẻ như đây là một vấn đề khá phổ biến, miễn là có nhiều người đăng bài về nó. Tuy nhiên tôi không thể tìm thấy bất kỳ câu trả lời hữu ích cho trường hợp của tôi.

  • generic.xaml nằm trong thư mục Chủ đề.
  • tệp generix.xaml Build Action được đặt thành Trang.
  • ThemeInfo được định nghĩa đúng trong AssemblyInfo.cs của tôi.

Trong ứng dụng thử nghiệm của tôi, nếu tôi tự sáp nhập các tập tin generic.xaml từ điều khiển tùy chỉnh của tôi lắp ráp vào ứng dụng nộp App.xaml như thế này:

<Application.Resources> 
    <ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/MyControlsAssembly;component/Themes/generic.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

sau đó các điều khiển tùy chỉnh là đúng theo chủ đề, nhưng nếu tôi không hợp nhất thủ công generic.xaml, các điều khiển sẽ xuất hiện với chủ đề Windows mặc định.

Bạn có thể cho tôi biết tôi đang quên và/hoặc làm sai?

Thông tin thêm:

  • My ThemeInfo lắp ráp thuộc tính được định nghĩa như sau:

    [assembly: ThemeInfo(ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)]

    (Lưu ý: kết quả chỉ là giống với bất kỳ sự kết hợp của các thông số cho thuộc tính ThemeInfo)

  • Có hai tệp .xaml khác bên cạnh tệp generic.xaml trong thư mục Chủ đề.

  • Có thư mục con trong thư mục Chủ đề tự chứa một tệp .xaml khác.
+4

Đỗ bạn vẫn có bộ DefaultStyleKeyProperty trong một hàm tạo tĩnh trên các điều khiển tùy chỉnh của bạn? – Nogusta

+0

Bất kỳ may mắn nào tìm ra điều này? Tôi đã gần như cùng một điều chính xác xảy ra với lắp ráp điều khiển tùy chỉnh của tôi. Nếu tôi thêm một tham chiếu trong App.config vào tệp generic.xaml thì các điều khiển theo chủ đề. Nếu tôi bỏ điều này ra thì tôi chẳng nhận được gì cả. –

+0

Liên kết này có áp dụng không? http://social.msdn.microsoft.com/Forums/vstudio/en-US/2e1fb162-e828-4fd9-832f-d2791c1980b4/isnt-genericxaml-supposed-to-loaded-automatically Tôi đã đối mặt với cùng một vấn đề, và tôi nghĩ rằng đây là nguyên nhân gốc rễ –

Trả lời

7

Bạn cần dòng sau trong constructor điều khiển tùy chỉnh của bạn:

public class MyCustomControl : Control 
{ 
    static MyCustomControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl))); 
    } 
} 

Sau đó, nếu bạn có một tập tin generic.xaml bên trong thư mục chủ đề, với phong cách mẫu sau:

<Style TargetType="{x:Type local:MyCustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MyCustomControl}"> 
       <Border> 
        <Label>Testing...</Label> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Giờ đây, kiểu sẽ tự động được áp dụng mà không cần thêm bất kỳ sự hợp nhất nào.

+0

Điều này không hiệu quả đối với tôi. Nhìn vào bình luận của tôi về câu hỏi ban đầu – bigfoot

+0

Bắt đầu với một giải pháp trống và xem bạn có thể làm cho nó hoạt động được không? – Eternal21

+0

Đó là những gì tôi đang làm. Tôi bắt nguồn từ Xceed Data Grid. Nếu tôi tạo một MyControl mới: Control hoặc MyButton: Button, nó hoạt động. Có lẽ nó là Xceed hỗ trợ chủ đề mà đi vào chơi ở đây, và tôi cần phải nhìn vào hướng dẫn của họ về các chủ đề, hoặc chỉ đơn giản là chấp nhận từ điển hợp nhất trong ứng dụng của tôi. Trừ khi các ý tưởng khác bề mặt. – bigfoot

3

Để áp dụng kiểu mặc định trong Chủ đề \ Generic.xaml trong thư viện điều khiển tùy chỉnh của tôi, tôi quyết định tìm nguồn cảm hứng từ thư viện điều khiển nguồn mở được thiết lập tốt (MahApps). Dự án này cung cấp cho bạn một ví dụ thực sự tốt về cách cấu trúc và bố trí một thư viện điều khiển tùy chỉnh.

Cắt một câu chuyện dài ngắn, để có được phong cách mặc định của bạn trong Chủ đề \ Generic.xaml bạn cần bao gồm những điều sau đây trong tập tin AssemblyInfo.cs trong tùy chỉnh của bạn kiểm soát thư viện:

[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] 

Trong trường hợp của tôi, điều khiển tùy chỉnh của tôi AssemblyInfo.cs nhìn cái gì đó như:

using System.Runtime.InteropServices; 
using System.Windows; 
using System.Windows.Markup; 

[assembly: AssemblyCopyright("...")] 
[assembly: ComVisible(false)] 

[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] 

[assembly: AssemblyVersion("1.0.0.0")] 
[assembly: AssemblyFileVersion("1.0.0.0")] 
[assembly: AssemblyInformationalVersion("1.0.0.0")] 
[assembly: AssemblyTitleAttribute("...")] 
[assembly: AssemblyDescriptionAttribute("")] 
[assembly: AssemblyProductAttribute("...")] 
[assembly: AssemblyCompany("...")] 
0

Không chắc nếu điều này làm việc trong WPF, nhưng nó làm việc cho tôi trong Silverlight:

vị thi công:

public class MyCustomControl : Control 
{ 
    static MyCustomControl() 
    { 
     this.Style = (Style)Application.Current.Resources["MyCustomControlStyle"]; 
    } 
} 

Kiểu:

<Style x:Key="MyCustomControlStyle" TargetType="{local:MyCustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{local:MyCustomControl}"> 
       <Border> 
        <Label>Testing...</Label> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
Các vấn đề liên quan