2010-01-06 31 views
7

Tôi có một số Viewbox với số lượng TextBlock s được chia tỷ lệ và định vị hoàn hảo theo số ViewBox. Một cái gì đó như thế này:Làm thế nào để giữ một FontSize không đổi trong Khung nhìn WPF?

<Viewbox Stretch="Uniform"> 
    <Canvas Width="100" Height="100"> 
     <Ellipse Width="100" Height="100" Stroke="Black"/> 
     <TextBlock Width="100" TextAlignment="Center" FontSize="12">Top Center</TextBlock> 
    </Canvas> 
</Viewbox> 

Nếu người dùng thay đổi kích thước Viewbox nội dung của nó được chia tỷ lệ hoàn toàn phù hợp. Tuy nhiên, tôi muốn giữ số FontSize thành 12 bất kể kích thước thực tế của Viewbox.

Tôi làm cách nào để thực hiện việc này? Tôi có thể làm điều này trong XAML mà không đính kèm sự kiện Resize không?

Trả lời

10

ViewBox sẽ không cho phép bạn giữ kích thước phông chữ không đổi, đó không phải là cách hoạt động. Bạn cần phải đặt nội dung bên ngoài giao diện hộp cho điều đó xảy ra:

<Grid> 
    <Viewbox Stretch="Uniform"> 
     <Canvas Width="100" Height="100"> 
      <Ellipse Width="100" Height="100" Stroke="Black"/> 
     </Canvas> 
    </Viewbox> 
    <TextBlock TextAlignment="Center" FontSize="12">Top Center</TextBlock> 
</Grid> 

Lưu ý rằng tôi loại bỏ các tài sản Chiều rộng từ TextBlock, tôi chỉ để cho nó kéo dài cho chiều rộng của lưới điện, cho phép sự liên kết văn bản đi chăm sóc của các trung tâm.

Hoặc, bạn có thể nhận được sáng tạo và ràng buộc FontSize tài sản cho ActualWidth của ViewBox và có nó có quy mô phù hợp, ví dụ:

Chuyển đổi:

class ViewBoxConstantFontSizeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (!(value is double)) return null; 
     double d = (double)value; 
     return 100/d * 12; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

Cách sử dụng:

<Window.Resources> 
    ... 
    <local:ViewBoxConstantFontSizeConverter x:Key="conv"/> 
</Window.Resources> 
... 
<Viewbox Name="vb" Stretch="Uniform"> 
    <Canvas Width="100" Height="100"> 
     <Ellipse Width="100" Height="100" Stroke="Black"/> 
     <TextBlock Width="100" TextAlignment="Center" 
        FontSize="{Binding ElementName=vb, 
             Path=ActualWidth, 
             Converter={StaticResource conv}}"> 
      Top Center 
     </TextBlock> 
    </Canvas> 
</Viewbox> 
+1

Cảm ơn. Tôi đoán tôi đã đơn giản hóa ví dụ của tôi một chút quá nhiều. Tôi cần Viewbox để chăm sóc vị trí của văn bản của tôi, nhưng không phải là FontSize. – Hallgrim

+1

Đã thêm một giải pháp thay thế cho câu trả lời của tôi, hãy dùng thử. Đó là một chút quá liều, nhưng nó có thể làm việc :) –

+0

Ấn tượng! Điều đó có hiệu quả, nhưng tôi đã hy vọng điều gì đó đơn giản hơn một chút. – Hallgrim

7

Đây có thể là một sửa chữa dễ dàng quá.

<Viewbox StretchDirection="DownOnly" > 
    <Label Content="Enable" FontSize="10" FontStretch="Normal" /> 
</Viewbox> 
Các vấn đề liên quan