我想要做的是将两个控件放在同一个位置/位置,具体是一个包含ProgressBar的按钮和一个包含Icon的按钮,一旦进度条已满,我想切换它具有图标的按钮,如复选框/切换按钮,它有多个状态,当我更改它时,它会更改控件。
控件的图片示例:
OBS:控件位于使用MahApps的标题栏控件中 OBS2:我正在使用Material Design XAML和Caliburn.Micro来制作出色的MVVM
XAML示例:
<Button FontSize="15"
FontWeight="Bold"
cal:Message.Attach="UpdateStatus"
ToolTip="Click here to show the update status."
Visibility="Visible">
<ProgressBar Style="{StaticResource MaterialDesignCircularProgressBar}"
Value="0"
IsIndeterminate="True"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Height="22"
Width="22" Foreground="White"/>
</Button>
<Button FontSize="15"
FontWeight="Bold"
cal:Message.Attach="Restart"
ToolTip="A update is scheduled, click here to restart the loader and apply the update."
Visibility="{Binding Path=RestartButtonVisibility, Mode=TwoWay}">
<materialDesign:PackIcon Height="22"
Width="22"
Kind="Cached"
FontWeight="Bold"/>
</Button>
有可能完成吗?是否有一种不是意大利面的好方法来实现它?
答案 0 :(得分:0)
您可以将第一个按钮的可见性绑定到VM中的属性(如第二个),并使它们互斥(一个可见,然后折叠)。在进度条完成结束时触发onpropertychanged,你应该好好去。
答案 1 :(得分:0)
要在同一位置放置两个UI元素,您可以将它们放在Grid
中。您只需将它们设置为相同的行/列(或者根本不设置任何内容)。然后,您可能需要实现一个新的IValueConverter
来完成这个技巧。
首先,在本地命名空间中的某个类:
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
.
.
.
public class MyValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double v = (double)value;
if (v == 100) return Visibility.Visible;
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
//Not really necesary...
return 0.0;
}
}
这是一个价值转换器。它与属性绑定一起使用,就像你想要做的那样。
现在,您的XAML:
<!-- This should be atop... -->
<Window.Resources>
<local:MyValueConverter x:Key="ValueConverter1"/>
</Window.Resources>
.
.
.
<Grid>
<Button x:Name="Button1">
<ProgressBar x:Name="ProgressBar1" Value="50" Width="100" Height="8"/>
</Button>
<Button x:Name="Button2" Visibility="{Binding Value, ElementName=ProgressBar1, Converter={StaticResource ValueConverter1}}">
<StackPanel Orientation="Horizontal">
<Image Source="yourIcon"/>
<TextBlock Text="Label for your button"/>
</StackPanel>
</Button>
</Grid>
我们使用值转换器来绑定第二个按钮的可见性,这样,如果进度条值为100,则Visibility
属性的值将为Visibility.Visible
,反之亦然