2012-04-17 8 views
6

Tôi tìm thấy một câu hỏi hỏi về cách để tránh thêm bộ chuyển đổi giá trị tùy chỉnh để tài nguyên ứng dụng của một người:WPF: Làm cách nào để đăng ký thêm các trình biến đổi giá trị tiềm ẩn?

Using Value Converters in WPF without having to define them as resources first

Tuy nhiên tôi muốn đi một bước xa hơn và đăng ký chuyển đổi mà sau đó tiềm ẩn, như trong ví dụ này:

<SolidColorBrush Color="Blue" /> 

Ở đây, tôi giả định rằng một số ngầm định "StringToSolidColorBrushConverter" đang khởi động làm cho ví dụ hoạt động.

Ví dụ này không không công việc:

<Window.Resources> 
    <Color x:Key="ForegroundFontColor">Blue</Color> 
</Window.Resources> 

<TextBlock Foreground={StaticResource ForegroundFontColor}>Hello</TextBlock> 

Tôi tin rằng đó là bởi vì không có implcit ColorToSolidColorBrushConverter rằng WPF chỉ có thể nhặt và sử dụng. Tôi biết làm thế nào để tạo ra một, nhưng làm thế nào tôi sẽ "đăng ký" nó để WPF sử dụng nó automagically mà không cần chỉ định chuyển đổi trong biểu thức ràng buộc ở tất cả?

+1

Đó [tính năng được cung cấp qua 'TypeConverter's] (http://msdn.microsoft.com/en-us/library/aa970913.aspx), và tôi không hoàn toàn chắc chắn rằng bạn có thể tiêm nó vào thời gian chạy trong một thời trang lành mạnh vì nó đòi hỏi các thuộc tính trên các lớp hoặc các thuộc tính mà bạn không sở hữu. – user7116

Trả lời

4

Nếu bạn nhìn vào các mã nguồn mà bạn sẽ tìm thấy điều này

public sealed class SolidColorBrush : Brush 
{ 
    public Color Color 
    { ... } 
    ... 
} 

[TypeConverter(typeof (ColorConverter))] 
public struct Color : IFormattable, IEquatable<Color> 
{ 
    ... 
} 

Việc chuyển đổi được thực hiện bởi ColorConverter.

Và cũng

[TypeConverter(typeof (BrushConverter))] 
public abstract class Brush : Animatable, IFormattable, DUCE.IResource 
{ ... } 

public class TextBlock : ... 
{ 
    public Brush Foreground 
    { ... } 
} 

Trường hợp chuyển đổi được thực hiện bằng BrushConverter.

Không có chuyển đổi 'ngầm' mà bạn có thể đăng ký. Tất cả được thực hiện bằng cách áp dụng các thuộc tính TypeConverter với kiểu của trình biến đổi giá trị thích hợp cho các thuộc tính hoặc các lớp có liên quan.

Trong ví dụ của bạn, bạn cần phải sử dụng

<Window.Resources> 
    <SolidColorBrush x:Key="ForegroundFontColor" Color="Blue"/> 
</Window.Resources> 

<TextBlock Foreground={StaticResource ForegroundFontColor}>Hello</TextBlock>