C# Property eines UserControls wird nicht im XAML-Editor angezeigt

Krik

Fleet Admiral
Registriert
Juni 2005
Beiträge
12.000
Moin zusammen,

ich habe ein kleines User Control erstellt, das ein Border- und darin ein Label-Control enthalten. Jetzt will ich beide Controls als Property nach außen sichtbar machen, sodass man sie bequem ändern kann.

Ich habe also ein Property im User Control erstellt, das so aussieht:
Code:
<UserControl x:Name="UserControl" x:Class="MyProject.MyUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="100" d:DesignWidth="100"
             Height="100" Width="100"
             MinHeight="50" MinWidth="50">

    <Grid x:Name="Grid" Background="#FF0F0F0F" Height="{Binding ActualHeight, ElementName=UserControl, Mode=OneWay}" Width="{Binding ActualWidth, ElementName=UserControl, Mode=OneWay}" >
        <Border x:Name="Border" BorderThickness="2" Background="Black" BorderBrush="White" Margin="5">
            <!-- mehr Inhalt -->
        </Border>
    </Grid>

</UserControl>
Das Property:
Code:
public static readonly DependencyProperty ContentBorderProperty = DependencyProperty.Register("ContentBorder", typeof(Border), typeof(MyUserControl));
public Border ContentBorder
{
    get { return this.Border; } // "Border" ist der Name des Border-Objekts
    set { this.Border = value; }
}

Füge ich jetzt das User Control in einem Fenster hinzu:
Code:
<Window x:Class="MyProject.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:MyProject"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <l:MyUserControl />
    </Grid>
</Window>
Blendet er mir bei <l:MyUserControl ?/> nicht das oben definierte Property als Auswahl ein. Normalerweise poppt da ja ein kleines Fenster auf, dass die verfügbaren Properties anzeigt.

Warum macht er das nicht?
Edit: Macht er doch. Nach einem Neustart (Beta-Software ;)) zeigte er es mir an, allerdings als <l:MyUserControl ContentBorder="" /> das so nicht zu gebrauchen ist. Strings nimmt er hier ja nicht.


Über das Eigenschaftenfenster kann ich mir die Property-Änderung in den XAML-Code einfügen lassen. Das Ergebnis sieht dann so aus:
Code:
<Window x:Class="MyProject.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:MyProject"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <l:MyUserControl>
            <l:MyUserControl.ContentBorder>
                <Border/>
            </l:MyUserControl.ContentBorder>
        </l:MyUserControl>
    </Grid>
</Window>
Das ist unerwartet, aber ich vermute, es liegt an der Verschachtelung der Controls im User Control.
Hier bekomme ich allerdings das drin liegende Border nicht geändert. Bei zB <Border Background="Red"/> tut sich nix.

Warum ist das so?

Eigentlich will ich nur so was wie <l.MyUserControl ContentBorder.Background="Red"> machen können. Und VS soll mir das auch direkt so vorschlagen.

Verwendet wird Visual Studio 11 Ultimate Beta unter Windows 8 Consumer Preview. Das Projekt ist ein WPF-Projekt mit .Net 4.5.

Gruß, Laurin
 
Zuletzt bearbeitet:
Probiers mal hiermit im XAML: ClassModifier="Public" für Border und Label und was auch immer du public haben willst. Ich glaube das er nur das XAML Interpretiert und nicht den C# Code den du geschrieben hast. Aber damit sollte es gehen, hofentlich :)
 
Fehler 1 x:ClassModifier="Public" ist für die Sprache C# ungültig.
*narf*
Da hat sich MS ja wieder was ausgedacht, wobei sie ja noch extra von C# reden.

Edit: Nicht einfach blind kopieren. Er hat sich am großem "P" verschluckt. Dennoch hat das nicht den gewünschten Erfolg gebracht. Ich kann weiterhin nicht die Eigenschaften der dem User Control untergeordneten Controls verändern.
 
Zuletzt bearbeitet:
schade ... aber per Default sind sie eh schon public ... also wenn ich ein property vom Typ String erstelle dann sehe ich dieses auch ... wenn ich daraus zum bsp ne border mache, dann kann ich im XAML nicht auf die eigenschaften der Border zugreifen, ABER im *.xaml.cs Teil schon ... dann hab ich leider keinen Plan :D

hätte dir gerne geholfen, jedoch habe ich mit XAMLs noch nicht sooooooo viel gemacht ...
 
Zuletzt bearbeitet:
1. möchtest du nicht die Border als Property, sondern deren BorderBrush ;)
2. ist dein UserControl wahrscheinlich als internal deklariert und liegt nebenbei in einem Assembly.
3. möchtest du das Binding-System benutzen:

Code:
<UserControl x:Name="uc" ....>
  <Border x:Name="contentBorder" BorderBrush="{Binding ElementName=uc, Path=DependencyPropertyName}>...</Border>
</UserControl>

Edit.
Wenn du das komplette Aussehen deiner UserControl von aussen beeinflussen willst, bist du mit einer TemplatedControl besser aufgehoben.
 
Zuletzt bearbeitet:
1. Nein, nicht nur. Ich möchte an alle Eigenschaften aller untergeordneten Elemente auf die ein oder andere Art herankommen. Deswegen habe ich mir gedacht, gleich die Controls als Property öffentlich zu machen. Geht nur irgendwie nicht so einfach.
2. Nein, public partial class MyUserControl : UserControl. Hätte aber daran liegen können.
3. Da muss ich nachsehen, was das genau für einen Effekt hat.

Zum Edit:
TemplatedControl, so so. Das schaue ich mir an. Vielen Dank für den Hinweis! :)
 
Zurück
Oben