0

我正在开发 Windows 8 平板电脑应用程序

这是我的自定义用户控件:

<Grid>
    <TextBox x:Name="Points" Visibility="Collapsed" IsHitTestVisible="False" Grid.ColumnSpan="3" Grid.Column="4" HorizontalAlignment="Left" Margin="48,10,0,0" Grid.Row="1" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" TextChanged="TextBox_TextChanged"/>
</Grid>

我放在 MainPage 表单上:

<local:MyUserControl1 x:Name="Test" HorizontalAlignment="Left" Margin="280,493,0,0" VerticalAlignment="Top" Width="584" Height="166"/>

在 C# (MAinPage.xaml.cs) 中:

Test.Points.Text = "";

错误:

Gamification.MyUserControl1.Points' is inaccessible due to its protection level

在 Windows Phone 8 中我没有这些问题......

如何解决?

编辑2:

添加控件:右键单击 -> 添加 -> 新建项目 -> 用户控件

完全控制 XAML:

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

<Grid>
    <TextBox x:Name="Points" Visibility="Collapsed" IsHitTestVisible="False" Grid.ColumnSpan="3" Grid.Column="4" HorizontalAlignment="Left" Margin="48,10,0,0" Grid.Row="1" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" TextChanged="TextBox_TextChanged"/>
</Grid>
</UserControl>

完全控制 C#:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

namespace Gamification
{
public sealed partial class MyUserControl1 : UserControl
{
    public MyUserControl1()
    {
        this.InitializeComponent();
    }

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {

    }
}
}

主页 XAML:

<Page
x:Class="Gamification.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Gamification"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <local:MyUserControl1 x:Name="Test" HorizontalAlignment="Left" Margin="280,493,0,0" VerticalAlignment="Top" Width="584" Height="166"/>
    <Button Content="Button" HorizontalAlignment="Left" Margin="670,692,0,0" VerticalAlignment="Top" Click="Button_Click"/>
</Grid>
</Page>

主页 C#:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        Test.Points.Text = "";
    }
4

2 回答 2

2

您的 UserControl 本身就是一种类型。它只会暴露那些为自己公开的元素。您的控件中的 x:Name'd 元素只能对其自身进行访问,除非您将它们公开给 UserControl。

您需要公开一个属性,该属性允许 UserControl 的使用者设置该属性,该属性反过来会更改您的内部元素。这通常通过该 DP 上的 DependencyProperty 和 PropertyChange 通知来完成。

于 2013-09-09T18:05:22.783 回答
0

您可以添加x:FieldModifier="public"TextBlock 以使其在用户控件之外可用。
请记住,这不是一个非常好的做法,因为它会破坏 UserControl 的封装(在您的情况下,UserControl 应该公开一个 PointText 依赖项属性,以便使用该控件的页面不需要知道这个文本是如图所示,使用依赖属性也将使您能够使用此属性的绑定)。

于 2013-09-10T12:21:55.523 回答