このプロジェクトでは、カスタム コントロール (inSignalLight) をリスト ボックス (または他のコントロール、並べて表示したい) に追加して、画面にいくつかの画像を設定したいと考えています。カスタム コントロールに画像を設定して「ObservableCollection」に追加しましたが、何も表示されません。私はWPFに本当に慣れていないので、xamlが正しいかどうかはよくわかりません...リストボックスでそれを行うより良い方法がある場合は、それも教えてください。
inSignalLights = new ObservableCollection<inSignalLight>();
写真を表示したいページのxamlは次のとおりです。
<Page x:Class="Project.Pages.MainPicView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="Beige"
Title="MainPicView" d:DesignHeight="343" d:DesignWidth="676">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Label Content="Label" Height="30" HorizontalAlignment="Left" Margin="61,195,0,0" Name="label1" VerticalAlignment="Top" Width="164" />
<ListBox ItemsSource="{Binding Path=inSignalLights}" Width="400" Height="25" Margin="0,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Left">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
</Grid>
</Page>
編集:
これは、カスタム コントロールの xaml です。
<UserControl x:Class="Project.CustomControls.inSignalLight"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="16" d:DesignWidth="16">
<Grid>
<Image Height="16" HorizontalAlignment="Left" Margin="0,0,0,0" Name="signalImage" Stretch="Fill" VerticalAlignment="Top" Width="16" />
</Grid>
</UserControl>
編集:
for (int i = 0; i < inpins; i++)
{
InPin ip = iFace.getInPin(i);
parent.insertNewSignalLight(ip);
}
public void insertNewSignalLight(InPin ip)
{
inSignalLight isl = new inSignalLight(ip);
isl.setLightOff();
this.inSignalLights.Add(isl.signalImage);
}
public void setLightOff()
{
setThreadSafeImage(signalImage);
}
private void gotLightSignal(InPin pin, EventArgs e)
{
Thread.CurrentThread.Join(200);
if (pin.PinState == 1)
setLightOn();
else
setLightOff();
}
public void setThreadSafeImage(Image iS)
{
string strUri2 = String.Format(@"pack://application:,,,/;component/Images/Signal_Gron_16.png");
BitmapImage img = new BitmapImage(new Uri(strUri2));
img.Freeze();
iS.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new Action(() => iS.Source = img));
}