Слишком указанное пространство имен в UserControl завершается сбоем WPF Build - PullRequest
0 голосов
/ 09 июля 2009

У меня очень простой пользовательский элемент управления, и я пытаюсь создать его экземпляр в XAML. Я обнаружил, что когда я переусердствую с пространством имен, у меня возникают проблемы с x: Name.

Вот мой UserControl:

<UserControl x:Class="UserControlTest.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="300" Height="300">
<Grid>
    <Label Name="Label1">Label</Label>
</Grid>
</UserControl>

Вот код для UserControl:

Namespace UserControlTest
Partial Public Class UserControl1

End Class
End Namespace

Теперь обратите внимание, что у меня корневое пространство имен моего проекта VB.Net установлено в «UserControlTest». Зная это, взгляните на мое главное окно: Вот мое главное окно:

<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:control="clr-namespace:UserControlTest.UserControlTest"
Title="Window1" Height="300" Width="300">
<Grid>
    <control:UserControl1 />
</Grid>
</Window>

Посмотрите, как псевдоним элемента управления должен иметь «UserControlTest.UserControlTest»? Это потому, что у меня корневое пространство имен моего проекта установлено в UserControlTest, и я также определил пространство имен UserControl как UserControlTest. Если я не использую пространство имен для UserControl, у меня нет проблем.

Однако, поскольку я сделал это, сборка завершается неудачно, если я пытаюсь применить x: Name к UserControl, как показано ниже:

    <control:UserControl1 x:Name="test"/>

Это не удастся собрать, с этой ошибкой:

Type 'UserControlTest.UserControlTest.UserControl1' is not defined. 

Кто-нибудь может объяснить, почему? Нужно ли мне избегать помещения пользовательских элементов управления в пространства имен только для того, чтобы я мог дать им значения x: Name? Я хотел бы манипулировать своими UserControls из-за кода, и без x: Name, я в порядке. Но я не хочу жертвовать использованием пространства имен только ради того, чтобы его получить!

Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 19 сентября 2012

У меня была такая же проблема (после перестройки проекта сначала все работало нормально ...). Я помещаю UserControl в отдельное пространство имен.

0 голосов
/ 19 февраля 2013

Я столкнулся с той же проблемой в проекте vb.net, и, несмотря на попытки предложения здесь и в других местах, не смог решить эту проблему. На самом деле, я смог перенести точно такой же код из нашего проекта в новый проект, и он работал просто отлично (насколько я мог определить, что вся конфигурация в новом проекте была идентична). В решении, предоставленном Дэвидом, я заметил, что он использует c # - мне интересно, не странно ли это связано с vb.net.

В конце концов, пользовательский элемент управления, который мне нужно было использовать, был довольно простым, и я реализовал его как ресурсный шаблон ControlTemplate, чтобы обойти эту проблему. Извините, у меня нет лучшего ответа, я действительно не рад своим выводам ...

0 голосов
/ 09 июля 2009

Какое пространство имен определено в коде позади вашего пользовательского элемента управления?

Если ваш проект назывался Foo, и в этом проекте была папка Controls, любой новый пользовательский элемент управления, добавленный в эту папку, получал бы пространство имен Foo.Controls.

Тогда в вашем XAML вы можете ссылаться на него так:

xmlns:Controls="clr-namespace:Foo.Controls"
...
<Controls:UserControl1 x:Name="uc1"/>

Кажется, у вас проблема с именами.

EDIT:

Вот как я это делаю в моем проекте.

StatusBar.xaml.cs

namespace Client.Controls.UserControls
{
public partial class StatusBar : UserControl
{ 
...
}
}

StatusBar.xaml

<UserControl x:Class="Client.Controls.UserControls.StatusBar">
</UserControl>

Main.xaml.cs

using Client.Controls.UserControls;

namespace Client
{
public partial class Main : Window
{
...
}
}

Main.xaml

<Window x:Class="Client.Main"
xmlns:UserControls="clr-namespace:Client.Controls.UserControls">
<UserControls:StatusBar x:Name="mainStatusBar" />
</Window>
...