C++/CX WPF,在代码中访问用户控件 属性

C++/CX WPF, acces to User Control property in code

Solution :

Add

#include "MenuEntryControl.xaml.h"

in MenuControl.cpp.

Thx Andy !

我在 visual studio 社区 2017 年用 C++/CX 编写了一个程序。 我在 XAML.

中构建我的界面

所以,我做了一个自定义用户控件(这是一个自定义按钮)

MenuEntryControl.xaml

这是 MenuEntryControl 的 xaml :

<UserControl
x:Class="XXXXXX.MenuEntryControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XXXXXX"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="54"
d:DesignWidth="276">

<Grid x:Name="container">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="39*"/>
        <ColumnDefinition Width="63*"/>
        <ColumnDefinition Width="143*"/>
        <ColumnDefinition Width="31*"/>
    </Grid.ColumnDefinitions>
    <TextBlock x:Name="TitleInput" Grid.Column="2" TextAlignment="Center" Margin="0,21,0,15" TextWrapping="Wrap" Text="I N P U T" Foreground="White" FontFamily="Open Sans Light"/>
    <Image x:Name="image" Source="ms-appx:///Assets/settings.png" HorizontalAlignment="Left" Height="28" VerticalAlignment="Top" Width="29" Margin="17,14,0,0" Grid.Column="1"/>
    <Button x:Name="ClickableZone" Grid.ColumnSpan="4" Height="54" Width="276" Click="ClickableZone_Click" BorderThickness="0" Background="#00000000"/>
</Grid> 
</UserControl>

MenuEntryControl.xaml.h :

[Windows::Foundation::Metadata::WebHostHidden]
public ref class MenuEntryControl sealed
{
    public:
        MenuEntryControl();
        void SetTitle(Platform::String ^title);
        void SetFocus(bool focused);

        //Titre affiché sur le bouton (Set attribut s_title)

        property Platform::String ^ Title
        {
            Platform::String ^ get() { return s_title; }
            void set(Platform::String ^ value)
            {
                s_title = value;
                Refresh();
            }
        }

        property Windows::UI::Xaml::Media::ImageSource ^ Icon
        {
            Windows::UI::Xaml::Media::ImageSource^ get() { return is_icon; }
            void set(Windows::UI::Xaml::Media::ImageSource ^ value)
            {
                is_icon = value;
                Refresh();
            }
        }


    private :
        Platform::String ^ s_title; //Titre du bouton (Attribut)
        bool b_isFocused;
        Windows::UI::Xaml::Media::ImageSource ^ is_icon;    //Icone affichée sur le bouton (Attribut)
        void ClickableZone_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);

        //Methode de rafraichissement de l'UI
        void Refresh();


};

重建后,我将此控件添加到 MenuControl.xaml(主要和配置)

MenuControl.xaml

这是 MenuControl.xaml

的 xaml 代码
<UserControl
x:Class="XXXXXX.MenuControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:XXXXXX"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="720"
d:DesignWidth="276">

<Grid Background="#FF4B4B4B">
    <Border BorderBrush="#66FFFFFF" BorderThickness="0,0.4,0,0" HorizontalAlignment="Left" Height="10" Margin="0,83,0,0" VerticalAlignment="Top" Width="276"/>
    <TextBlock x:Name="textBlock" HorizontalAlignment="Left" TextAlignment="Center" Margin="0,30,0,0" TextWrapping="Wrap" Text="X X X X X X" VerticalAlignment="Top" Foreground="White" FontFamily="Open Sans Light" FontSize="24" Width="276"/>
    <local:MenuEntryControl x:Name="Main_button" HorizontalAlignment="Left" Height="55" Margin="0,105,0,0" VerticalAlignment="Top" Width="276" Icon="ms-appx:///Assets/home.png" Title="M A I N"/>
    <local:MenuEntryControl HorizontalAlignment="Left" Height="58" Margin="0,160,0,0" VerticalAlignment="Top" Width="276" Title="C O N F I G U R E" Icon="ms-appx:///Assets/settings.png"/>

</Grid>   </UserControl>

那么,问题来了 ;)

在 MenuControl.cpp 中,我无法使用 x:name "Main_button".

访问我的用户控件的方法
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Navigation;

// The User Control item template is documented at       https://go.microsoft.com/fwlink/?LinkId=234236

MenuControl::MenuControl()
{
    InitializeComponent();
}

void XXXXXX::MenuControl::Configure()
{
    Main_button->   
}

这一行的视觉表示:

Main_button->

"Pointer to incomplete class not allowed"

老实说,我被屏蔽了。你有什么想法吗?

在 C++ 中,您需要包含要使用的任何 类 的头文件。要修复此编译错误,请包含定义了 MenuEntryControl 的头文件。在 MenuControl.cpp 的顶部或附近添加:

#include "MenuEntryControl.xaml.h"