2009-03-24 7 views
3

I was man einen Kreis zeichnet, der gleichmäßig in seinen Raum passt, mit einer konstanten Stokedicke. Eine ViewBox bringt mir die einheitliche Passform, aber nicht die konstante Stokedicke.Gibt es WPF XAML für Uniform fit aber konstante Hubstärke

<Viewbox Stretch="Uniform" MinHeight="10" MinWidth="10" > 
    <Ellipse Height="10" Width="10" Fill="Red" StrokeThickness="1" Stroke="Yellow"/> 
</Viewbox> 

Antwort

4

Wenn Sie keine Breite oder Höhe der Ellipse angeben, sind die Standardwerte "Auto". Zusammen mit den Standardwerten für HorizontalAlignment/VerticalAligment von "Stretch" sollte dies dazu führen, dass sich die Ellipse auf die Breite und Höhe ihres Containers "dehnt" (mit konstanter Strichstärke).

Die * ContentAlignment-Eigenschaften des übergeordneten Containers können dieses Verhalten beeinflussen, aber auch hier sollten die standardmäßigen, nicht festgelegten Werte das von Ihnen gewünschte Verhalten aufweisen.

Edit: Überarbeitung meines Vorschlags, weil ich nicht erkannte, dass die Ellipse ein Kreis bleiben muss (keine Sorge, ich habe beschlossen, eine Kopie von "Reading for Comprehension" zu holen).

Ich schlage vor, Sie binden die Breite und Höhe Eigenschaften der Ellipse zu einer MultiBinding der ActualWidth und ActualHeight Eigenschaften des übergeordneten Containers. Implementieren Sie dann einen "Mehrwertkonverter", der den Mindestwert aus der Mehrfachbindung zurückgibt.

So könnte der Konverter wie folgt aussehen:

class MinimumValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return values.Cast<double>().Min(); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Und die Ellipse Eigenschaften wie diese gebunden sein könnte:

<Window.Resources> 
    <l:MinimumValueConverter x:Key="MinimumValueConverter" /> 
</Window.Resources> 
<Ellipse Stroke="Black" StrokeThickness="1"> 
    <Ellipse.Width> 
     <MultiBinding Converter="{StaticResource MinimumValueConverter}"> 
      <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UIElement}}" Path="ActualWidth" /> 
      <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UIElement}}" Path="ActualHeight" /> 
     </MultiBinding> 
    </Ellipse.Width> 
    <Ellipse.Height> 
     <MultiBinding Converter="{StaticResource MinimumValueConverter}"> 
      <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UIElement}}" Path="ActualWidth" /> 
      <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UIElement}}" Path="ActualHeight" /> 
     </MultiBinding> 
    </Ellipse.Height> 
</Ellipse> 
+0

Aber es ist nicht mehr ein Kreis. :) – jyoung

+0

Es ist jetzt ein Kreis. Vielen Dank. – jyoung