0

Silverlight for Windows Embedded プロジェクトに取り組んでいます。イメージ コントロールで構成されるカスタム ユーザー コントロールを定義しました。カスタム コントロールの異なるインスタンスに対して、xaml で異なる画像ソースを指定したいと考えています。そこで、カスタム コントロールで Dependency Property "MyImage" を定義します。

Blend C# コード ビハインドの場合: public UserControl1() { InitializeComponent(); ItemImage.DataContext = これ; }

    public ImageSource MyImage
    {
        get { return (ImageSource)GetValue(MyImageProperty); }
        set { SetValue(MyImageProperty, value); }
    }

    public static readonly DependencyProperty MyImageProperty =
        DependencyProperty.Register("MyImage", typeof(ImageSource), typeof(UserControl1), null);

UserControl.xaml で、イメージ コントロールの Source プロパティを MyImage にバインドします。

<Image x:Name="ItemImage" Margin="0,0,90,0" Source="{Binding MyImage}"/>

したがって、カスタム コントロールを使用すると、xaml でこれを行うことができます。

<local:UserControl1 HorizontalAlignment="Left" Margin="94,117,0,0" Width="196" Height="85" VerticalAlignment="Top" MyImage="img1.png"/>
<local:UserControl1 HorizontalAlignment="Left" Margin="94,217,0,0" Width="196" Height="85" VerticalAlignment="Top" MyImage="img2.png"/>

Blend でのテストは問題ありません。2 つのカスタム コントロール インスタンスに表示されている 2 つの画像を確認できます。

次に、SWE C++ コード ビハインドに移り、UserControl1.cpp で Dependency プロパティを再定義して登録します。

XRDependencyPropertyMetaData dpmImage = XRDependencyPropertyMetaData();
dpmImage.Size = sizeof(IXRImageSource);
dpmImage.pfnPropertyChangeNotification = ImagePropertyChanged;
dpmImage.pfnTypeConverter = ConvertNameTypeConverter;
dpmImage.pfnEnumerableCreation = NULL;

XRValue defImage;
defImage.vType = VTYPE_OBJECT;
defImage.pObjectVal = NULL;
dpmImage.DefaultValue = defImage;

hr = pApplication->RegisterDependencyProperty(L"MyImage", VTYPE_OBJECT, ControlID(), &dpmImage, &m_dpMyImageID);

void UserControl1::ImagePropertyChanged( __in IXRDependencyObject* pControl, __in XRValue* pOldValue, __in XRValue* pNewValue )
{......}
HRESULT UserControl1::ConvertNameTypeConverter( XRValue *pValIn, XRValue *pValOut )
{......}

コンパイルと実行は成功しましたが、2 つのコントロールに画像が表示されていません。

デバッグ時に、ConvertNameTypeConverter コールバックが最初に呼び出されていることがわかります。イメージ ファイル名が文字列として pValIn に格納されていることがわかります。これは、MSDN ドキュメントの説明と一致しています。Windows Embedded の XAML が解析フェーズでこの関数を呼び出すと、pValIn は常に文字列になります。

次に ImagePropertyChanged コールバックが呼び出され、ConvertNameTypeConverter() で pValOut に設定した値が pNewValue に含まれていることがわかります。

私の質問は、私は正しい方法でやっていますか? 画像ファイル名の文字列しか取得できない場合、文字列から画像バイナリを取得するにはどうすればよいですか?

画像バイナリを xaml から C++ コード ビハインドに直接転送して直接表示する方法はありますか?

ありがとう!

4

2 に答える 2

0

XRPack によって生成される ID を定義できます。これを行うには、XAML コードで次のように定義します。

<Image xrpack:Resource="Source:902(IDR_SETTINGS)" Margin="0" Source="Image.png"/>

Expression Blend を使用している場合は、おそらく "xrpack" の名前空間も定義する必要があります。これを行うには、UserControl で次のように定義します。

mc:Ignorable="d xrpack"
xmlns:xrpack="http://schemas.microsoft.com/windowsembedded/silverlight/packaging"

C++ コードでは、LoadImageFromResource メソッドを使用できるようになりました。

LoadImageFromResource(App::GetHInstance(), MAKEINTRESOURCE(IDR_SETTINGS), L"XAML_RESOURCE", &pImage);
于 2014-02-18T10:46:59.663 に答える