/ / Come utilizzare l'immagine nella barra di avanzamento di WPF? - c #, wpf, image, xaml, barra di avanzamento

Come usare l'immagine nella barra di avanzamento di WPF? - c #, wpf, image, xaml, barra di avanzamento

Ho una foto, voglio usarla in WPF come barra di avanzamento.

Si prega di guardare l'immagine per capirlo.

Il codice sotto, ha ripetuto l'immagine.

inserisci la descrizione dell'immagine qui

La casella di avanzamento in movimento sopra la barra di avanzamento.

inserisci la descrizione dell'immagine qui

<ControlTemplate
x:Key="ImageProgressBarTemplate"
TargetType="ProgressBar">
<ControlTemplate.Triggers>
<EventTrigger
RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard>
<Storyboard
x:Name="str">
<RectAnimation
x:Name="quatanim"
Storyboard.TargetName="imgbrush"
Storyboard.TargetProperty="(ImageBrush.Viewport)"
From="0,0,36,36"
To="36,0,36,36"
Duration="0:0:5"
AutoReverse="False"
RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>

<!-- Custom progress bar goes here -->
<Border
Name="PART_Track"
Width="{TemplateBinding Width}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
Height="{TemplateBinding Height}"
CornerRadius="0"
Padding="1.5">

<Grid>
<!-- Rounded mask (stretches to fill Grid) -->
<Border
Name="mask"
Background="#EEEEEE"
CornerRadius="0" />

<!-- Any content -->

<Rectangle
Name="PART_Indicator"
HorizontalAlignment="Left"
Height="{TemplateBinding Height}">
<Rectangle.OpacityMask>
<VisualBrush
Visual="{Binding ElementName=mask}" />
</Rectangle.OpacityMask>
<Rectangle.Fill>
<ImageBrush
x:Name="imgbrush"
ImageSource="/myproject;component/Assets/myimage.png"
AlignmentX="Left"
Stretch="Fill"
TileMode="Tile"
AlignmentY="Top"
ViewportUnits="Absolute"
Viewport="0,0,36,36"
ViewboxUnits="RelativeToBoundingBox"
Viewbox="0,0,1,1">
</ImageBrush>
</Rectangle.Fill>
</Rectangle>
</Grid>
</Border>

<ProgressBar Template="{StaticResource ImageProgressBarTemplate}"/>

Tutto ciò di cui ho bisogno è un tutorial dettagliato su come usare l'immagine nella barra di avanzamento di wpf per questo tipo di immagini.

risposte:

1 per risposta № 1

Devi progettare il tuo modello di barra di avanzamento.

<ControlTemplate TargetType="ProgressBar">
<Canvas>
<ProgressBar x:Name="pgbar" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"
Value="{TemplateBinding Value}"
Minimum="{TemplateBinding Minimum}"
Maximum="{TemplateBinding Maximum}"/>

<Image Source="image.PNG" Canvas.Left="{TemplateBinding Value}">
<Image.RenderTransform>
<!-- width / 2 and height /2-->
<TranslateTransform X="-56" Y="-25"/>
</Image.RenderTransform>
</Image>
</Canvas>
</ControlTemplate>

1 per risposta № 2

Un miglioramento per la risposta di Klaus Fischer:

Ecco ProgressBar:

<ProgressBar Value="{Binding ProgressbarValue}" Template="{StaticResource Progressbar2}" />

Ed ecco il modello (vedi post di Klaus Fischer):

<ControlTemplate x:Key="Progressbar2" TargetType="ProgressBar">
<Canvas >
<ProgressBar x:Name="pgbar" Visibility="Hidden" Width="{Binding ElementName=StatusGrid,Path=ActualWidth}" Background="Transparent" Value="{TemplateBinding Value}" />
<Image Source="Resources/Images/running.png" Height="42px" Canvas.Left="{TemplateBinding Value, Converter={StaticResource WidthConverter}, ConverterParameter={x:Reference pgbar}}" />
</Canvas>
</ControlTemplate>

Come puoi vedere, c'è un convertitore in

Canvas.Left

proprietà.

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var bar = ((System.Windows.Controls.ProgressBar) parameter);
var percentPixe = bar.ActualWidth/100;
return percentPixe*(double) value-42;
}

L'espressione

valore-42

gestisce le dimensioni dell'immagine, altrimenti l'immagine sarebbe di fronte al ProgressBar reale.

Questo dovrebbe fare il lavoro.