1

Silverlight for Windows Embedded プロジェクトに取り組んでいます。TextBlock コントロールとイメージ コントロールで構成されるカスタム ユーザー コントロールを定義しました。カスタム コントロールの別のインスタンスで別のテキストを指定したいと考えています。したがって、Expression Blend で次のことを行いました。

namespace WindowsEmbeddedSilverlightApplication1
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
            ItemText.DataContext = this;
        }

        public String MyText
        {
            get { return (String)GetValue(MyTextProperty); }
            set { SetValue(MyTextProperty, value); }
        }

        public static readonly DependencyProperty MyTextProperty =
            DependencyProperty.Register("MyText", typeof(String), typeof(UserControl1), null);
    }
}

UserControl1.xaml:

<UserControl
    ......
    x:Class="WindowsEmbeddedSilverlightApplication1.UserControl1"
    d:DesignWidth="196" d:DesignHeight="85">

    <Grid x:Name="LayoutRoot">
        <Image x:Name="ItemImage" Margin="0,0,90,0"/>
        <TextBlock x:Name="ItemText" HorizontalAlignment="Right" Width="68" Text="{Binding MyText}" TextWrapping="Wrap" Height="23" VerticalAlignment="Bottom"/>
    </Grid>
</UserControl>

MainPage.xaml でカスタム ユーザー コントロールを使用するには:

<UserControl
    ......
    xmlns:local="clr-namespace:WindowsEmbeddedSilverlightApplication1"
    x:Class="WindowsEmbeddedSilverlightApplication1.MainPage"
    Width="640" Height="480">

    <Grid x:Name="LayoutRoot" Background="White">
        <local:UserControl1 HorizontalAlignment="Left" Margin="94,117,0,0" Width="196" Height="85" VerticalAlignment="Top" MyText="Text1"/>
        <local:UserControl1 HorizontalAlignment="Left" Margin="94,217,0,0" Width="196" Height="85" VerticalAlignment="Top" MyText="Text2"/>
    </Grid>
</UserControl>

したがって、Expression Blend でアプリケーションを実行すると、カスタム ユーザー コントロールの 2 つのインスタンスに正しいテキストが表示されます。

次に、プロジェクトを Visual Studio Silverlight for Windows Embedded Application にインポートします。登録をやり直さなければならないという投稿をいくつか読みました。だから私は次のことをしました:

UserControl1.h:

    static HRESULT Register()
    {
        HRESULT hr = E_FAIL;
        hr = XRCustomUserControlImpl<UserControl1>::Register (__uuidof(UserControl1), L"UserControl1", L"clr-namespace:WindowsEmbeddedSilverlightApplication1");
        hr = RegisterDependencyProperties();
        return hr;
    }

    static HRESULT RegisterDependencyProperties();

    HRESULT SetMyText(WCHAR* pText);
    HRESULT GetMyText(BSTR* pbstrText);

public:
    static DEPENDENCY_PROPERTY_ID m_dpMyTextID;

UserControl1.cpp:

HRESULT UserControl1::RegisterDependencyProperties()
{
    HRESULT hr = E_FAIL;
    IXRApplication* pApplication = NULL;

    XRDependencyPropertyMetaData dpm = XRDependencyPropertyMetaData();
    dpm.Size = sizeof(XRDependencyPropertyMetaData);
    dpm.pfnPropertyChangeNotification = NULL;
    dpm.pfnTypeConverter = NULL;
    dpm.pfnEnumerableCreation = NULL;

    XRValue defValue;
    defValue.vType = VTYPE_READONLY_STRING;
    defValue.pReadOnlyStringVal = L"Default";
    dpm.DefaultValue = defValue;

    hr = GetXRApplicationInstance(&pApplication);
    hr = pApplication->RegisterDependencyProperty(L"MyText", VTYPE_BSTR, ControlID(), &dpm, &m_dpMyTextID);

    pApplication->Release();

    return hr;
}

HRESULT UserControl1::SetMyText( WCHAR* pText )
{
    HRESULT hr = E_FAIL;

    XRValue xrValue;
    xrValue.vType = VTYPE_READONLY_STRING;
    xrValue.pReadOnlyStringVal = pText;

    hr = SetPropertyValue(m_dpMyTextID, &xrValue);

    return hr;
}

HRESULT UserControl1::GetMyText( BSTR* pbstrText )
{
    HRESULT hr = E_FAIL;

    XRValue xrValue;

    hr = GetPropertyValue(m_dpMyTextID, &xrValue);

    if (SUCCEEDED(hr))
    {
        *pbstrText = xrValue.bstrStringVal;
    }

    return hr;
}

生成された MainPage.h と MainPage.cpp のコードは何も変更していません。

コンパイルは成功し、実行もOKです。カスタム コントロールは表示されますが、xaml に入力したテキストが表示されません。

私は何か間違っているか、何かが欠けていますか?このトピックに関する情報は、インターネット上であまり見つかりませんでした。誰かが私を正しい方向に向けることができますか?ありがとう!

4

1 に答える 1