2009-05-21 65 views
51

Tôi đang tạo ứng dụng WPF và tôi muốn biết cách tốt nhất để có thể thay đổi kích thước phông chữ cho mọi phần tử trong ui. Tôi có tạo từ điển tài nguyên và đặt Kiểu để đặt kích thước phông chữ cho tất cả các điều khiển tôi sử dụng không?Kích thước phông chữ toàn cầu WPF

Phương pháp hay nhất là gì?

Trả lời

69

tôi muốn làm điều đó đây cách:

<Window.Resources> 
     <Style TargetType="{x:Type Control}" x:Key="baseStyle"> 
      <Setter Property="FontSize" Value="100" /> 
     </Style> 
     <Style TargetType="{x:Type Button}" BasedOn="{StaticResource baseStyle}"></Style> 
     <Style TargetType="{x:Type Label}" BasedOn="{StaticResource baseStyle}"></Style> 
     <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource baseStyle}"></Style> 
     <Style TargetType="{x:Type ListView}" BasedOn="{StaticResource baseStyle}"></Style> 
     <!-- ComboBox, RadioButton, CheckBox, etc... --> 
    </Window.Resources> 

Bằng cách đó, nếu tôi muốn thay đổi TẤT CẢ các điều khiển, tôi chỉ cần thay đổi kiểu "baseStyle", phần còn lại sẽ kế thừa từ nó. (Đó là những gì thuộc tính BasedOn, bạn cũng có thể mở rộng kiểu cơ sở nếu bạn tạo các bộ định cư khác bên trong kiểu được kế thừa)

+3

Và nếu bạn cần thay đổi kích thước phông chữ khi đang bay, hãy đảm bảo rằng tất cả chúng được khai báo là DynamicResource, cả trong Kiểu và trong tham chiếu Kiểu thành "baseStyle". –

+0

Seroiouslly? Tôi đã thử làm điều đó và tôi nhận được lỗi này: Thuộc tính 'BaseOn' không hỗ trợ các giá trị kiểu 'DynamicResourceExtension'. Tôi vừa thay đổi mã từ StaticResource thành DynamicResource. Bạn nghĩ gì bị thiếu? – Carlo

+0

Quên về vấn đề nhỏ đó. Chúng tôi có tất cả các khai báo của chúng tôi được thiết lập là Người định cư được khai báo trên mỗi kiểm soát để chúng tôi không có phân cấp lớn. Bài đăng này giải thích nó khá tốt. http://stackoverflow.com/questions/585429/using-basedon-style-property-on-dynamicresources –

3

Đối với bất kỳ kiểu nào trong WPF, bạn nên có từ điển tài nguyên riêng biệt chứa các kiểu cho ứng dụng của bạn.

Nếu bạn muốn có một Kích thước phông chữ duy nhất được sử dụng lại trong suốt ứng dụng thì chỉ cần tạo kiểu cho kích thước phông chữ đó. Bạn có thể đặt tên/khóa duy nhất để sử dụng một cách rõ ràng hoặc bạn có thể đặt một targetType sẽ vượt qua toàn bộ ứng dụng.

Explicit chính:

<Style 
    x:Key="MyFontSize" 
    TargetType="TextBlock"> 
    <Setter 
     Property="FontSize" 
     Value="10" /> 
</Style> 

<Control 
    Style="{StaticResource MyFontSize}" /> 

* Lưu ý phong cách này có thể được sử dụng với điều khiển có contentPresenters

Đối với tất cả TextBlocks trong ứng dụng:

<Style 
    TargetType="TextBlock"> 
    <Setter 
     Property="FontSize" 
     Value="10" /> 
</Style> 

<TextBlock 
     Text="This text will be size 10" /> 
35

FontSizeProperty được kế thừa từ Điều khiển dành cho cha mẹ. Vì vậy, bạn chỉ cần thay đổi FontSize của cửa sổ chính của bạn.

Nếu bạn không cần phải hành vi động này nên làm việc:

Thêm một phong cách cho Window để ResourceDictionary

<Style TargetType="{x:Type Window}"> 
    <Setter Property="FontSize" Value="15" /> 
</Style> 

của bạn Áp dụng các kiểu mẫu chính của bạn (sẽ không được áp dụng ngầm vì nó một loại có nguồn gốc)

Style = (Style)FindResource(typeof (Window)); 
+0

có vẻ như thực hành tốt hơn câu trả lời được đánh dấu là giải pháp. Tôi sẽ đi với điều này, trong mọi trường hợp nó là rất ít mã. –

+2

EDIT: Không hoạt động (với khung 4.5 trong mọi trường hợp). –

+0

@KoertvanKleef - nó hoạt động với tôi trên .NET 4.5, bạn thấy vấn đề gì? – joshcomley

1

Nếu bạn cần thay đổi theo lập trình FontSize, không tĩnh (XAML), được áp dụng một lần cho tất cả cửa sổ, bạn có thể thực hiện:

TextElement.FontSizeProperty.OverrideMetadata(
      typeof(TextElement), 
      new FrameworkPropertyMetadata(16.0)); 

     TextBlock.FontSizeProperty.OverrideMetadata(
      typeof(TextBlock), 
      new FrameworkPropertyMetadata(16.0)); 

Giá trị này được áp dụng cho bất kỳ TextBlock, Nhãn và hầu hết mọi văn bản trong bất kỳ cửa sổ nào, trong khi đó không xác định cỡ chữ rõ ràng. Nhưng điều này không ảnh hưởng đến TextBox, bạn phải viết một mã tương tự cho nó hoặc bất kỳ điều khiển đặc biệt nào khác.

24

Một tùy chọn khác là xác định FontFamily và FontSize làm tài nguyên.

<FontFamily x:Key="BaseFontFamily">Calibri</FontFamily> 
<sys:Double x:Key="BaseFontSize">12</sys:Double> 

Bằng cách đó bạn có thể sử dụng chúng trong setters của bạn.

+0

Điều này phù hợp nhất với tôi vì nó cho phép bạn sử dụng {DynamicResource} và thay đổi kích thước phông chữ khi chạy. – Peter

+4

Phải nhập _xmlns: sys = "clr-namespace: System; assembly = mscorlib" _ và phương thức này hoạt động hoàn hảo. – wchoward

8
Application.Current.MainWindow.FontSize = _appBodyFontSize; 

Bằng cách này bạn có thể thay đổi cỡ chữ vào thời gian chạy cũng có.

3

TextElement.FontSize là một tài sản kế thừa, có nghĩa là bạn chỉ có thể thiết lập kích thước phông chữ ở phần tử gốc, và tất cả các yếu tố trẻ sẽ sử dụng kích thước đó (miễn là bạn không thay đổi chúng bằng tay)

+0

Quan trọng: "miễn là bạn không thay đổi chúng theo cách thủ công". Nó đã cho tôi một thời gian để tìm ra rằng thừa kế phông chữ đã làm việc vì tôi đặt nó ở đâu đó cho một phụ huynh bằng tay. –

12

<Window> có một thuộc tính FontSize.

Vì vậy, bạn có thể đặt phông chữ mong muốn thành phần nếu bạn muốn thay đổi phông chữ trong tất cả các phần tử trong cửa sổ đó.

<Window FontSize="12"> 

</Window> 
Các vấn đề liên quan