Frage

Ich versuche, eine benutzerdefinierte Steuerelement in Silverlight zu erstellen, die dynamisch ein Element skaliert in seiner Control. Erster Versuch des Control etwas wie folgt aussieht:

<ControlTemplate TargetType="controls:ProgressBar">
   <Grid>
      <Rectangle x:Name="TrackPart" Fill="{TemplateBinding Background}" HorizontalAlignment="Left" />
      <Rectangle x:Name="ProgressPart" Fill="Blue" >
      <Rectangle.RenderTransform>
         <ScaleTransform ScaleX="{TemplateBinding Progress}" />
            </Rectangle.RenderTransform>
         </Rectangle> 
   </Grid>
</ControlTemplate>

Allerdings diese Forum-Thread besagt, dass nur Template auf Derivate von FrameworkElements arbeitet. Scaletransform ist kein Framework. Gibt es eine Arbeit um für das? Best Practices für diese Art von Situation da draußen?

War es hilfreich?

Lösung

Anstatt die Eigenschaften scaleX und scaleY der Render Bindung, können Sie die Render selbst binden. Das Problem ist, dass die Quelle ein doppelter Wert ist, und Sie müssen eine Transformation. So müssen Sie in der Lage sein, eine doppelt auf eine Scaletransform zu konvertieren. Sie können eine IValueConverter erstellen, das zu tun:

public class TransformConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is double)
        {
            double d = (double)value;
            return new ScaleTransform { ScaleY = d, ScaleX = d };
        }
        else
        {
            return new ScaleTransform();
        }
    }

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

Sie können keine IValueConverter angeben in einem Template zu verwenden, so dass Sie eine regelmäßige Bindung mit Relative als TemplatedParent verwenden können. Wie folgt aus:

    <Rectangle x:Name="ProgressPart" Fill="Blue" 
           RenderTransform="{Binding Path=Progress, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource converter1}}" >

und Sie müssen die IValueConverter in den Ressourcen der Control der Wurzel platzieren, in Umfang der Bindung:

<ControlTemplate TargetType="controls:ProgressBar">
    <Grid>
        <Grid.Resources>
            <local:TransformConverter x:Key="converter1" />
        </Grid.Resources>

Andere Tipps

Unter der Annahme, dass Sie immer einfache Dinge wie ein Rechteck verwenden, können Sie das Rechteck Höhe und Breite an den Fortschritt binden, und dann einen verbindlichen Wandler verwenden Sie den Wert entsprechend anpassen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top