Saya punya tombol dengan gambar latar belakang tetap dan ingin menampilkan gambar overlay kecil di atasnya. Gambar hamparan mana yang akan dipilih bergantung pada properti ketergantungan ( LapCounterPingStatus
) dari viewmodel yang sesuai.
Inilah yang saya dapatkan sejauh ini:
<Button>
<Grid>
<Image Stretch="None"> <!-- Background Image -->
<Image.Style>
<Style TargetType="{x:Type Image}">
<Setter Property="Source" Value="/Images/Pingn.png"/>
</Style>
</Image.Style>
</Image>
<Image Stretch="None" Panel.ZIndex="1"> <!-- Small Overlay Image -->
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_UNKNOWN">
<Setter Property="Source" Value="/Images/RefreshOverlayn.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_FAILURE">
<Setter Property="Source" Value="/Images/ErrorOverlayn.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_SUCCESS">
<Setter Property="Source" Value="/Images/CheckmarkOverlayn.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Grid>
</Button>
Bagian yang relevan dari model tampilan saya
public class ConfigurationViewModel
{
public enum PingStatus { PING_UNKNOWN, PING_SUCCESS, PING_FAILURE };
public PingStatus LapCounterPingStatus
{
get { return _lapCounterPingStatus; }
set
{
_lapCounterPingStatus = value;
RaisePropertyChanged(LapCounterPingStatusPropertyName);
}
}
}
Saat ini, tidak ada gambar overlay sama sekali yang ditampilkan. Apa yang salah?
MEMPERBARUI
Jendela jejak IDE saya ditampilkan System.ArgumentException
dan System.FormatException
. Mungkinkah sumber masalah adalah jenis enumerasi yang tidak diketahui PingStatus
di XAML?
Jawaban:
Anda memerlukan 2 hal agar ini berfungsi:
1 - Tambahkan
xmlns
referensi di elemen root file XAML Anda, ke namespace tempat Enum Anda ditentukan:2 - di
Value
propertiDataTrigger
, gunakan{x:Static}
formulir:Perhatikan bahwa tipe Enum harus diawali dengan awalan xmlns yang Anda tentukan di atas.
Edit:
Jika Enum Anda dideklarasikan di dalam kelas, Anda perlu menggunakan sintaks:
{x:Static namespace:ClassName+EnumName.EnumValue}
sebagai contoh:
{x:Static my:ConfigurationViewModel+PingStatus.PING_UNKNOWN}
sumber
xmlns
seperti ini:xmlns:local="clr-namespace:MyCompany.Testbench"
dan pemicunya seperti itu<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="{x:Static local:PingStatus.PING_UNKNOWN}">
. Tidak, saya mendapatkan kesalahanCannot find the type 'PingStatus'
.enum PingStatus
didefinisikan di dalam kelasMyCompany.TestBench.ConfigurationViewModel
. Apakah saya harus menambahkan nama kelas di suatu tempat?Type t = typeof (System.Environment.SpecialFolder); Console.WriteLine (t.FullName); // prints System.Environment+SpecialFolder
Contoh kerja lengkap untuk WPF + MVVM.
Diuji pada MSVC 2017.
Dalam tampilan:
Jika menggunakan ReSharper, dan jika DataContext diatur dengan benar, akan ada intellisense ketika anda menekan
.
setelahStatusIcon
, yaitu ia akan menampilkan sifat-sifat enum yangDebug
,Info
,Warning
atauError
.Jika menggunakan ReSharper, itu akan menyarankan pembaruan berikut ke namespace di header untuk file XAML (bagus seperti itu):
Dan VieModel:
Kami juga menggunakan
Fody
untuk pengikatan otomatis.sumber