Элемент управления должен показывать дизайн с его названием и ценой в верхнем левом и нижнем правом углу. Я перекодирую программу из оконных форм и создал там собственный элемент управления. Я просто пытаюсь воспроизвести его в WPF и его шине борьбы
элемент управления работает, но он не работает с первым изображением для определения размера
или если изображение, которое я поднимаю, отличается от предыдущего изображения.
Проблема в том, что код не получает правильного размера до окончания события загрузки.
"поэтому я повторяю, основной вопрос - как получить размер, а затем вызвать второе событие, чтобы обновить наложение."
изображение контрольного результата:
! https://imgur.com/a/ubwjjbT
выпуск изображения второй коэффициент сжатия разной загрузки:
! https://imgur.com/wDukGSp
Второе загруженное изображение устраняет проблему с размером:
! https://imgur.com/JOUxv55
Кроме того, я читал о том, как пытаться превратить этот элемент управления в элемент управления многократного использования. Любые советы / предложения о том, с чего начать, следует понимать, что система в WPF будет принята с благодарностью.
следующий код - это то, что мне нужно, чтобы получить базовый макет, который я хочу. Мне все еще нужно, чтобы тема была лучше, но общий дизайн в основном правильный.
Я попытался поиграть с холстом, но не смог получить правильный макет
для всех, кого я знаю, это может быть совершенно неправильно, поэтому, если они лучше, пожалуйста, укажите это. Я не хочу идти по неверному пути.
Xaml
исправление было изменено событие размера изменено после загрузки источника.
<Image x:Name="pbMainImage" Source="{Binding Path=(local:SV.PbMainImage), Converter={StaticResource ImageConverter},
Mode=OneWay}" HorizontalAlignment="Center" VerticalAlignment="center" SizeChanged="name_price_sizingbclick"/>
<Button Name="pbbutton" Style="{StaticResource ImageButtonStyle}" Grid.ColumnSpan="6" Click="pbmain_Click" SizeChanged="name_price_sizingbclick">
<Border Name="Test" Grid.Row="0" Margin="{Binding Path=(local:SV.pading)}" Background="#252525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding Path=(local:SV.Imagespacing)}"/>
<ColumnDefinition Width=".2*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width=".2*"/>
<ColumnDefinition Width="{Binding Path=(local:SV.Imagespacing)}"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height=".15*"/>
<RowDefinition Height="*"/>
<RowDefinition Height=".15*"/>
</Grid.RowDefinitions>
<local:ZoomBorder x:Name="border" Grid.ColumnSpan="5" Grid.RowSpan="3" ClipToBounds="True" >
<Image x:Name="pbMainImage" Source="{Binding Path=(local:SV.PbMainImage), Converter={StaticResource ImageConverter},
Mode=OneWay}" HorizontalAlignment="Center" VerticalAlignment="center"/>
</local:ZoomBorder>
<TextBlock Grid.Column="1" Background="Orange" Opacity=".8" FontWeight="Bold" Padding="10 0 10 0" TextAlignment="Center" >
<Viewbox>
<TextBlock Text="{Binding Path=(local:SV.ActiveDesign)}" TextAlignment="Center"/>
</Viewbox>
</TextBlock>
<TextBlock Grid.Column="3" Grid.Row="3" Background="GreenYellow" Opacity=".8" FontWeight="Bold" Padding="10 0 10 0" TextAlignment="Center" >
<Viewbox>
<TextBlock Text="{Binding Path=(local:SV.sprice),StringFormat=${0}}" TextAlignment="Center" />
</Viewbox>
</TextBlock>
<Grid Grid.Row="3" Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Panel.ZIndex="2" Grid.Row="1" Style="{StaticResource RoundCorner}" Content="4" Click="prevImg" Visibility="Hidden"/>
</Grid>
<Grid Grid.Row="3" Grid.Column="3">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Panel.ZIndex="2" Grid.Row="1" Style="{StaticResource RoundCorner}" Content="4" Click="nextvImg" Visibility="Hidden" />
</Grid>
</Grid>
</Border>
</Button>
C #
//this is what moves the overlays around. on source change it runs when source is changed
public static void name_price_sizing(object sender, EventArgs e)
{
MainWindow myWindow = Application.Current.MainWindow as MainWindow;
Button p = myWindow.pbbutton;
Image i = myWindow.pbMainImage;
if (toggle == 0)
{
SV.Imagespacing = Math.Round(((p.ActualWidth - i.ActualWidth) / 2) / 2, MidpointRounding.AwayFromZero) * 2 - 14;
}
else { SV.Imagespacing = Math.Round(((p.ActualWidth - i.ActualWidth) / 2) / 2, MidpointRounding.AwayFromZero) * 2; }
if (SV.Imagespacing < 0) { SV.Imagespacing = 0; }
}
//this is what moves the overlays around. on control click to resize for fullscreen
public void name_price_sizingbClick(object sender, EventArgs e)
{
// StaticVariables.Imagespacing = (pbbutton.ActualWidth - pbMainImage.ActualWidth) / 2;
if (toggle == 0) { SV.Imagespacing = Math.Round(((pbbutton.ActualWidth - pbMainImage.ActualWidth) / 2) / 2, MidpointRounding.AwayFromZero) * 2 - 14; } else { SV.Imagespacing = Math.Round(((pbbutton.ActualWidth - pbMainImage.ActualWidth) / 2) / 2, MidpointRounding.AwayFromZero) * 2; }
if (SV.Imagespacing < 0) { SV.Imagespacing = 0; }
}