Laden...

Forenbeiträge von MichaS Ingesamt 39 Beiträge

15.07.2008 - 17:34 Uhr

Hallo,

ich habe folgendes Problem:

ich habe eine ListView mit einer GridView, und möchte dynamisch GridViewColumns hinzufügen. Im Xaml möchte ich zwei verschiedene CellTemplate definieren, eines mit einem TextBlock, und eines mit einem ContentPresenter:


<DataTemplate x:Key="SimpleContentTemplate">
            <Border BorderThickness="0,0,1,1" BorderBrush="Gray" Margin="-6,0,-6,0">
                <ContentPresenter Height="19" Margin="2,3" Content="???" />
            </Border>
        </DataTemplate>

        <DataTemplate x:Key="SimpleTextTemplate">
            <Border BorderThickness="0,0,1,1" BorderBrush="Gray" Margin="-6,0,-6,0">
                <TextBlock Height=" 19" Margin="2,3" Text="???" />                                       
            </Border>
        </DataTemplate>

Zur Laufzeit möchte ich den Columns das jeweilige CellTemplate zuordnen, und beispielsweise ein Binding definieren, um ein Property meines zugrundeliegenden Objektes an das Textproperty der TextBox zu binden. Ich komme aber irgendwie nicht weiter.

Mit einem DisplayMemberPath-Property ist das alles kein Problem:


Binding b = new Binding("hier der Path");
column.DisplayMemberBinding = b;

Das problem ist, dass ich per Converter auch mal einen DateiSystemPfad, der in einem Property gespeichert ist, per Converter in ein Bild umwandeln muß, und dann bekomme ich nur per ToString() den Pfad vom Objekt.

Hat jemand einen Rat?

Micha

01.07.2008 - 11:46 Uhr

Hallo, ich habe folgendes Problem:

ich template einen ToggleButton und erweitere diesen um ein Popup. Im Popup selbst sind zwei Buttons definiert, die eine Click-Method besitzen. Wenn ich dort jetzt vom ToggleButton das Property IsChecked auf false setze, möchte ich, dass das Popup wieder verschwindet, das funktioniert aber nicht, wieso? ich binde doch IsChecked über das TemplateBinding an das IsChecked vom ToggleButton im Template, und dann das IsOpen vom Popup an das IsChecked vom Template-ToggleButton...


<Window x:Class="ControlTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        
        <ControlTemplate x:Key="btnTemplate" TargetType="ToggleButton">
            <Grid>
                <ToggleButton x:Name="btn" Content="{TemplateBinding Content}" Width="{TemplateBinding Width}" IsChecked="{TemplateBinding IsChecked}" />
                <Popup x:Name="popup" Placement="Bottom" IsOpen="{Binding ElementName=btn, Path=IsChecked}">
                    <StackPanel>
                        <Button Width="{Binding ElementName=btn, Path=Width}" Click="Button_Click">insert before</Button>
                        <Button Width="{Binding ElementName=btn, Path=Width}" Click="Button_Click">insert after</Button>
                    </StackPanel>
                </Popup>
            </Grid>
        </ControlTemplate>
        
    </Window.Resources>
    
    <Grid>
        <ToggleButton x:Name="tb" Height="21" Width="100" Template="{StaticResource btnTemplate}">insert</ToggleButton>
    </Grid>
</Window>


private void Button_Click(object sender, RoutedEventArgs e)
        {
            tb.IsChecked = false;
        }

hat viell.jemand eine Lösung?

Gruß, Micha

23.06.2008 - 16:50 Uhr

Hallo,

kann man ein GridView so gestalten, dass beispielsweise bei 4 Spalten die erste Spalte Links ausgerichtet ist, und alle folgenden Spalten abhängig von ihrer Breite sich am rechten Rand der GridView ausrichten? D.h.die erste Spalte nimmt dann die restliche Breite ein. Ich möchte nämlich die anschließende leere Spalte vermeiden, wenn die GridView größer ist. Im Code behind geht das mit explizitem Setzen der Width, aber ich wollt mal wissen, ob man das auch in XAML definieren kann.

Gruß, Micha

19.06.2008 - 14:02 Uhr

Hallo,

ich habe eine Listbox, die eine ObservableCollection ("Contacts") von Instanzen eines bestimmten Objekttyps (<Contact>) als Itemssource besitzt. Um ein solches Objekt zu visualisieren, habe ich für diese Klasse ein DataTemplate definiert, welches ein Expander-Element als Wurzel besitzt. Nun mein Problem:

Ich erzeuge per Buttonklick ein neues Element (Item) für die ListBox. Anschließend möchte ich auf den Expander zugreifen und diesen expandieren. Laut MSDN (hier) funktioniert das folgendermaßen:


Contact c = new Contact();
contacts.Add(c);
DependencyObject o = lbContacts.ItemContainerGenerator.ContainerFromItem(lbContacts.Items[lbContacts.Items.Count - 1]);
ListBoxItem item = o as ListBoxItem;
item.ApplyTemplate();
ContentPresenter presenter = FindVisualChild<ContentPresenter>(item);
DataTemplate template = presenter.ContentTemplate;
Expander exp = (Expander)item.ContentTemplate.FindName("expander", presenter);
exp.IsExpanded = true;

bei der vorletzten Anweisung wird eine InvalidOperationException geworfen:

This operation is valid only on elements that have this template applied.

Das einzige was ich bisher herausgefunden hab ist, wenn ich nach dem Adden des Contact-Objektes in die ObservableCollection einen DispatcherTimer mit einer TimeSpan von 10ms starte, und dort dann den anschließenden Code (ohne item.ApplyTemplate() ) abarbeite, funktioniert das ganze. Mir scheint, dass es ein kurzen Moment dauert, bis das DataTemplate für das Objekt erzeugt wird, wobei ich aber hoffte, dies mit ApplyTemplate() erzwingen zu können. Trotzdem erhalte ich diese Exception.

hat jemand solch ein problem schon mal gehabt und gelöst?

Gruß, Micha

18.06.2008 - 15:47 Uhr

Problem gelöst, ich selbst hab einen Fehler eingebaut, da ich die OnRender-Methode überschrieben habe und dort jedesmal die Itemssource neu zuweise 😁 😁

18.06.2008 - 12:42 Uhr

Hallo,

wenn ich ein Grid mit drei Columns habe, und links in die erste Column eine TreeView setze, und in der nächsten Column einen GridSplitter, habe ich das Problem, dass bei einem Resizing der linken Column der ganze Baun neugezeichnet wird und das sehr lange dauert, ich also den GridSplitter gar nicht in nahezu Echtzeit ziehen kann. Kann man das Neuszeichnen des TreeView verhindern und ihn in seinem alten Zustand belassen, d.h. alle vorher expandierten Knoten sollen nach dem Resizing auch expandiert sein?

PS.:Ich vermute, es liegt daran, dass ich die TreeViewItems mit neuen Templates versehe, und die alle neugezeichnet werden müssen...

Danke für Hilfe, Micha

18.06.2008 - 12:38 Uhr

Ich habs jetzt selbst lösen können, wenn jemand interesse hat, kann sich ja melden.

Gruß, Micha

17.06.2008 - 10:23 Uhr

Hallo,

ich möchte eine TreeView so umstylen, dass die Zeilen je nach Baumtiefe alternierende Farben bekommen. Das ganze klappt mit einem ItemContainerStyleSelector ganz gut, aber ich würde auch gern das Template für den ItemContainer anpassen, weil ich möchte, dass die kompletten Zeilen (so breit wie mein TreeView) diese Farben bekommen sollen, und nicht nur über die Breite des Textes (Items).

Ist so ein Umstyling möglich?

Gruß, Micha

10.06.2008 - 10:58 Uhr

Hallo,

ich benutze eine ListBox, die mir eine Menge von Objekten darstellt. Diese Objekte werden mithilfe eines DataTemplate visualisiert, welches als oberstes Element einen Expander besitzt.

Nun möchte ich per Code-Behind den Expander aufklappen lassen, beispielsweise vom jeweils letztem Item, was jedoch nicht funktioniert. Beim debuggen stelle ich fest, dass ich eine Referenz auf das Objekt bekomme, aber sobald ich Expander.IsExpanded auf true setze, passiert nichts!


DependencyObject o = lbContacts.ItemContainerGenerator.ContainerFromItem(lbContacts.Items[lbContacts.Items.Count - 1]);
ListBoxItem item = o as ListBoxItem;
(item.ContentTemplate.LoadContent() as Expander).IsExpanded = true;

Das DataTemplate sieht folgendermassen aus:


<DataTemplate x:Key="ContactTemplate">
   <Expander x:Name="expander" ExpandDirection="Down" IsExpanded="False" Style="{DynamicResource ExpanderContacts}">
      <Expander.Header>
         <StackPanel Orientation="Horizontal">
            <CheckBox x:Name="checkbox" Style="{DynamicResource StyleCheckBox}" VerticalAlignment="Center" />
            <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Text="{Binding CompleteContact}" />
         </StackPanel>
      </Expander.Header>
      <Border BorderThickness="0" Background="{DynamicResource BrushInputBackground}">
         <Grid>
            ...
         </Grid>
      </Border>
   </Expander>
</DataTemplate>

Weiß jemand Rat, bin echt kurz vorm verzweifeln...der Expander muß aufgeklappt werden, weil dort schnell Daten hinzugefügt werden müssen.

06.06.2008 - 16:43 Uhr

lol..grad wollt ich posten, dass ichs mit dem dispatcher timer hinbekommen hab, schon stehts drinne 😉 danke trotzdem!! dachte nicht, dass es so simple ist...

06.06.2008 - 15:25 Uhr

Weil genau das nicht geht:

im User Control rufe ich im Konstruktor die Methode


public void StartTimeView()
{
   System.Threading.TimerCallback cb = new System.Threading.TimerCallback(job);
   System.Threading.Timer timer = new System.Threading.Timer(cb, tbTime, 0, 1000);
}

auf. Die Callback Methode sieht so aus:


private static void job(object param)
{
   TextBlock tb = param as TextBlock;
   tb.Text = DateTime.Now.ToShortTimeString();
}

Beim kompilieren kommt folgende Meldung:

The calling thread cannot access this object because a different thread owns it.

Any Solutions? 😉

06.06.2008 - 15:12 Uhr

Hallo,

ist bestimmt eine simple Aufgabe: ich möchte einfach, dass nach der Initialisierung meines Usercontrols ein darin enthaltenes Label die aktuelle Uhrzeit fortschreitend anzeigt. Leider funzt der Ansatz mit Thread nicht, da der andere Thread nicht das Objekt im UI Thread manipulieren darf, da kommt eine Fehlermeldung.

Hat jemand eine Idee, bzw. einen Code Snippet?

Danke im Voraus, Micha

26.05.2008 - 15:47 Uhr

hi talla, ich habs jetzt mittlerweile auch mit den radiobuttons hinbekommen, ich wollte es so lösen, weil diese von haus aus schon die exclusive selection mitbringen.

war eigentlich ganz einfach:


<ControlTemplate TargetType="RadioButton">
    <Border x:Name="bo" BorderBrush="Transparent" CornerRadius="5" BorderThickness="1,1,1,0" >
                            <TextBlock x:Name="tb" VerticalAlignment="Center" HorizontalAlignment="Center" Width="auto" Margin="10,0,10,0" Text="{TemplateBinding Content}"
                                      FontFamily="Arial" FontSize="14" FontWeight="Bold"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsChecked" Value="True">
                                <Setter Property="Background" TargetName="bo" Value="Black"/>
                                <Setter Property="Background" TargetName="tb" Value="Black"/>
                                <Setter Property="Foreground" TargetName="tb" Value="White"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter TargetName="tb" Property="Foreground" Value="#CCCCCC" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>

gruß, micha

26.05.2008 - 10:12 Uhr

Hi,

ich versuche gerade ein flaches menü mit nur einer stufe zu bauen. ich möchte dazu radiobuttons benutzen, weil immer nur ein punkt ausgewählt sein soll. wie kann ich jetzt diese buttons templaten, damit diese nicht diese bullets besitzen, sondern ein selektierter button beispielsweise mit invertierten farben dargestellt wird?

ein paar hinweise wären sehr hilfreich! 😉

gruß, micha

26.05.2008 - 10:08 Uhr

super, das wars! hab aber den background mithilfe von triggern gesetzt, je nachdem ob die mouse hoverd, aber klappt ebenso! 😉

danke dir!

gruß, micha

22.05.2008 - 17:20 Uhr

Hallo,

ich habe folgendes Problem:

ich habe in XAML eine Border definiert und ihr einen Schatten über BitmapEffect zugewiesen. Wenn ich jetzt innerhalb dieser Border jetzt wieder eine Border definiere, hat diese auch einen Schatten, dh. der Value des Properties wird nach unten vererbt. Wie kann ich dies verhindern? Wenn ich in der inneren Border das BitmapEffect-Property auf {x:Null} setze, geschieht nichts.



<Border Width="200" Height="100" BorderBrush="Gray" BorderThickness="1" CornerRadius="5" Margin="5">
                <Border.BitmapEffect>
                    <DropShadowBitmapEffect />
                </Border.BitmapEffect>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="80" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
// Diese Border hat auch einen Schatten :(
                    <Border Width="70" Height="70" BorderBrush="Gray" BorderThickness="0.1" CornerRadius="5" >
                        <Border.Background>
                            <LinearGradientBrush StartPoint="0.5, 0.0" EndPoint="0.5, 1.0">
                                <GradientStop Color="DarkRed" Offset="1.0" />
                                <GradientStop Color="White" Offset="0.0" />
                            </LinearGradientBrush>
                        </Border.Background>
                        <Image Source="/Pictures/pic.png" />
                    </Border>
                    <DockPanel Grid.Column="1">
                        <TextBlock DockPanel.Dock="Bottom" TextWrapping="Wrap" Text="do want you want here" Margin="5,10,5,15" 
                                   FontSize="10" ></TextBlock>
                        <TextBlock Text="test module" Height="25" FontSize="14" TextAlignment="Center" Margin="5,20,5,0"
                                   Foreground="DarkRed"></TextBlock>
                    </DockPanel>
                </Grid>
            </Border>


22.05.2008 - 17:08 Uhr

In der MSDN gibts sehr wohl viel darüber zu lesen, man muß nur richtig suchen ^^

Eine geniale Wissensquelle zu WPF/XAML findet sich meiner Meinung nach auch in Beatriz Costa's Blog, dort werden auch sehr spezielle Dinge erläutert, die man täglich braucht.

Gruß, Micha

22.05.2008 - 17:04 Uhr

Ganz einfach, du hast beispielsweise einen root node und zwei childs, die erzeugst du und dann brauchst du zwei ObservableCollections, eins für den root und dann für die childs, besser wäre es, bei der Erzeugung eines Nodes im Konstruktor gleich die Subnodes zu initialisieren, damit du gleich die Add-Methode nutzen kannst und nicht erst eine neue ObservableCollection erzeugen mußt.



Node root = new Node();
root.NodeName = "wurzel";

Node child1 = new Node();
child1.NodeName = "kind1";

Node child2 = new Node();
child2.NodeName = "kind2";

ObservableCollection<Node> rootNodes = new ObservableCollection<Node>();
ObservableCollection<Node> subNodes = ObservableCollection<Node>();

subNodes.Add(child1);
subNodes.Add(child2);

root.SubNodes = subNodes();
rootNodes.Add(root);

myTreeView.DataContext = rootNodes;


Mit WPF kann man nicht alles über XAML abfackeln, also ein bisschen Coden mußt du schon noch 😉

Schau dir mal hierzu folgendes an: http://msdn.microsoft.com/de-de/library/ms742980.aspx

Ein bisschen Mühe mußt du dir schon machen, im web gibt es dazu sehr viel, einfach mal "Onkel Google" fragen und nach "wpf xaml treeview" und optional "data binding" suchen...

Gruß, Micha

21.05.2008 - 12:31 Uhr

Im XAML Code definierst du in den Resourcen (bspw. Page.Resources) ein HierarchicalDataTemplate:


<HierarchicalDataTemplate x:Key="TreeItemTemplate" ItemsSource="{Binding SubNodes}">
                <TextBlock Text="{Binding Path=NodeName}" />
        </HierarchicalDataTemplate>

Danach kommt die Definition des TreeViews:


<TreeView x:Name="tvDemo" ItemsSource="{Binding}" />

Im Codebehind generiere ich mir den Inhalt. Dazu brauchst du eine Klasse Node mit NodeName als string-Property und eine ObservableCollection<Node> SubNodes. Danach baust du die Baumstruktur auf mit Node als Wurzel und Node-Instanzen in SubNodes:


public class Node
        {
            private string nodeName;

            public string NodeName
            {
                get { return nodeName; }
                set { nodeName = value; }
            }
            private ObservableCollection<Node> subNodes;

            public ObservableCollection<Node> SubNodes
            {
                get { return subNodes; }
                set { subNodes = value; }
            }
        }

Anschließend setzt du das Property DataContext deiner TreeView auf den Wurzelknoten.


Node root = new Node();
// hier alles Initialisieren
tvDemo.DataContext = root;

Gruß, Micha

19.05.2008 - 16:32 Uhr

Hallo,

ich habe eine TreeView, die als Itemssource hierarchisch geordnete Knoten bekommt (Jeder Knoten hat eine ObservableCollection als Children). Gibt es eine Möglichkeit, per HierarchicalDatatemplate festzulegen, dass gewisse Knoten nicht selektierbar sind, sondern ich diese nur aufklappen kann? Vielleicht mit Triggern?
Die Knoten des Baumes kapsel ich mit einer MixedNode Klasse, die ein Property NodeItem von Typ object besitzt, die dann die unterschiedlichen Instanzen aufnehmen.

Danke im Voraus für eventuelle Ideen...

Gruß, Micha

09.05.2008 - 17:31 Uhr

Hm..wieso brauche ich einen Converter, wenn die Methode, die ich aufrufen will, einen String zurückgibt und ich genau diesen String an eine TextProperty zuweisen will?

Mir gehts darum, die richtige Syntax zu finden, damit die Objektmethode ausgeführt wird und an deren Ergebnis gebunden wird.

Micha

09.05.2008 - 17:21 Uhr

Hallo,

ich versuche grad verzweifelt, ein TextProperty einer TextBox an eine parameterlose Methode eines Objektes zu binden. Folgendes Szenario:

Ich habe einen ToggleButton, der nach Klick ein Popup öffnet, in der mir der Name des Monats eines DateTime-Objektes angezeigt wird. Dazu benötige ich einen ObjectDataProvider (befindet sich in Page.Resource):


<ObjectDataProvider ObjectInstance="DataPopup.DataContext" MethodName="ToShortDateString" x:Key="MyDateProvider" />

ToggleButton und das Popup definiere ich so:


<ToggleButton x:Name="btnPopup" Width="30" Height="19" HorizontalAlignment="Left" Click="Button_Click">pick</ToggleButton>
        <Popup x:Name="DatePopup" IsOpen="False" Height="120" Width="180" PopupAnimation="Fade" PlacementTarget="{Binding ElementName=btnPopup}"
               Placement="Bottom">
            <TextBox x:Name="tb" Background="White" Text="{Binding Path=ObjectInstance,Mode=OneWay,Source={StaticResource MyDateProvider},BindsDirectlyToSource=True}"></TextBox>
        </Popup>

im Code selber setze ich noch den DataContext des Popup Elements, in dessen Konstruktor direkt nach InitializeComponents():


DatePopup.DataContext = DateTime.Now;

Im Popup sehe ich aber nur "DatePopup.DataContext". was muß ich genau ändern, damit die Methode "ToShortDateString" vom DateTime-Objekt ausgeführt wird??

Gruß, Micha

06.05.2008 - 13:17 Uhr

Hallo, ich habe folgendes Problem:

Ich habe eine Reihe von DataTables und dazugehörige Klassen, deren Objekte mit den Rows der Tables übereinstimmen, d.h. die Column-Namen und -Typen matchen auch mit den Properties der zugehörigen Klasse.

Ich möchte jetzt eine Methode schreiben, der ich die DataTable und typeof(Objektklasse) übergebe und diese mir eine List<Objektklasse> zurückgibt.

Wie realisiere ich so etwas?? Möglicherweise mit generischen Methoden (mit denen ich keine Erfahrung habe 😉 )?

Danke für etwaige Hilfe, Micha

24.04.2008 - 14:42 Uhr

Hallo,

ich stehe vor folgendem Problem: möchte mir dynamisch eine ListView mit einem GridView aufbauen und generiere mir die Spalten in Abhängigkeit der Spalten in einer DataTable. Soweit funktioniert das ganze. Ich habe in einer bestimmten Spalte bool Werte für das Geschlecht, 0 für männlich, 1 für weiblich. Mit einem IValueConverter wandle ich den booleschen Wert in ein BitmapImage-Objekt um, den ich dann im CellTemplate an das Source-Property eines Image-Objektes binden möchte:


public void SetDataSource(DataTable table)
{
    // creating the columns for listview
    foreach (DataColumn column in table.Columns)
    {
        GridViewColumn gvColumn = new GridViewColumn();
        gvColumn.Header = column.ColumnName;
        Binding b = new Binding();

        if(column.ColumnName.Equals("Gender"))
        {
            gvColumn.CellTemplate = Resources["GenderCellTemplate"] as DataTemplate;
            b.Path = new PropertyPath(column.ColumnName);
            b.Converter = new GenderConverter();
        }
    
        else
        {
            b.Path = new PropertyPath(column.ColumnName);
            gvColumn.DisplayMemberBinding = b;
        }
        GridView.Columns.Add(gvColumn);
    }
    liste.DataContext = table.DefaultView;
}

Wie bekomme ich jetzt das Binding-Objekt b an die GridView-Zelle??
mit


gvColumn.DisplayMemberBinding = b;

geht es nicht, da dann zwar der IValueConverter benutzt wird, aber der zurückgegebene Wert nicht an das CellTemplate gebunden wird, sondern stattdessen einen TextBlock verwendet, der als Text den ToString()-Wert verwendet, also in diesem Fall

/Picture/true.jpg

in der Zelle steht...

Wo liegt hier der Fehler?

23.04.2008 - 17:18 Uhr

Ok, habs lösen können, habe DisplayMemberBinding und das setzen eines CellTemplate nacheinander statt alternativ verwendet..jetzt funktionierts 😉

23.04.2008 - 17:08 Uhr

Hehe, genau das hab ich auch immer vergessen 😉

23.04.2008 - 16:24 Uhr

Hi, setz mal in <ListView> noch das Property ItemsSource="{Binding}"

23.04.2008 - 16:03 Uhr

Hallo,

ich habe mir eine ListView implementiert und binde diese an eine DataTable. Alles funktioniert soweit gut. In einer Spalte der Tabelle liegt ein ByteArray vor welches ich mithilfe eines ValueConverters in ein Image konvertiere. Jetzt habe ich nur noch das Problem, dass in der betreffenden Spalte der ListView nur der String der Imageklasse, also das Ergebnis der ToString()-Methode "System.Windows.Controls.Image" angezeigt wird. Ändern würde ich das mit einem CellTemplate, aber mir fällt irgendwie nicht ein, wie ich das mit XAML definieren muß. Weiß jemand Rat?

Gruß, Micha

09.04.2008 - 17:07 Uhr

Hi,

wenn ich in VS 2008 eine WPF Anwendung erzeuge, dort im Main Window ein Frame-Element als Root anlege, dem ich als Source eine XAML-Page übergebe, sehe ich im Designer immer nur einen grauen Kasten mit "Frame" mittig. Ist es auch möglich, die eingebettete Page im Designer anzuschauen??

Gruß, Micha

09.04.2008 - 13:25 Uhr

Problem eben selbst gelöst 😉

im Dictionary:


<Image x:Key="HeaderLogo" Source="Pictures/logo.jpg"></Image>

und in der Page dann das ContentControl verwendet und den Content gesetzt:


<ContentControl Content="{DynamicResource HeaderLogo}"></ContentControl>

That's the way 😉

09.04.2008 - 13:08 Uhr

Hallo, ich habe folgendes Problem: Ich möchte in verschiedenen ResourceDictionary eine ImageSource bereitstellen:


<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    <ImageSource x:Key="HeaderLogo">..\Pictures\logo.jpg</ImageSource>
</ResourceDictionary>

Diese Resource möchte ich dann in einem Image-Objekt innerhalb einer Page zuweisen:


<Page x:Class="Sportsoftware.Ems.Client.Header"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Header" Height="60" Width="1024">
    <Grid>
        <Image Source="{DynamicResource HeaderLogo}"></Image>
    </Grid>
</Page>

in der App.xaml lade ich dann des ResourceDictionary:


<Application x:Class="Sportsoftware.Ems.Client.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Rsources\Pictures.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

Das ganze funktioniert super, wenn ich die Applikation starte, nur spielt mein Designer hier nicht mit. In der Entwurfsansicht erscheint jedes mal die Meldung "Problem beim Laden", und Source="{DynamicResource HeaderLogo}" wird als Fehler markiert. Außerdem steht dann in der Fehlerliste:

Fehler 1 Der Wert liegt außerhalb des erwarteten Bereichs.

Weiß jemand woran das liegt oder gibt es eine andere Möglichkeit, Bilder dynamisch mithilfe eines ResourceDictionary einzubinden? Ich möchte vom Dictionary nicht abweichen, da ich damit das Look&Feel meiner Anwendung dynamisch anpasse. Ich kann mit dieser Fehlermeldung leider nichts anfangen. Aber das Problem ist für mich groß, da ich gern die Veränderung sehen möchte, wenn ich meinen Xaml-Code ändere.

Danke & Gruß, Micha

02.04.2008 - 14:29 Uhr

Hallo,

ich bin gerade am verzweifeln. ich möchte für ein zweistufiges Menu-Control (d.h.nur ein Toplevel und ein Sublevel) ein eigenes ControlTemplate schreiben. Die MSDN bringt mir hierzu schon ein schönes Beispiel (hier).

Ich habe jedoch ein anderes Aussehen im Sinn, nämlich so ähnlich wie (hier

D.h.wenn ich auf ein toplevel menu item klicke, möchte ich, dass die zugehörigen SubItems eine Zeile darunter nebeneinander auftauchen und auch sichtbar bleiben, wenn man einen Menüeintrag auswählt, um den Anwender zu zeigen, wo genau er sich gerade befindet. Das Problem ist, wie ich das Template für die TopLevelHeader definiere.

Weiß jemand Rat, oder hat ein XAML-Codebeispiel für dieses Problem?

Gruß, Micha

14.03.2008 - 11:32 Uhr

Hallo, ich experimentiere im Visual Studio 2008 gerade mit Fenstervererbung. Ich habe mir eine Klasse erzeugt, die von Window erbt und erzeuge in der onInitialize()-Methode ein Grid mit zwei RowDefinitions. Das ganze definiere ich ohne XAML, da sonst die Vererbung aus irgendeinem Grund nicht funktioniert. Wenn ich jetzt ein neues Fenster von der Basisklasse ableite, diesmal mit XAML, und in der onInitialize()-Methode eine zusätzliche RowDefinition hinzufüge, funktioniert das hervorragend.

das einzige Manko: im visuellen Designer sehe ich nicht den vererbten Inhalt (Grid) sondern nur das leere Fenster, nur kann ich damit leider nicht weiterarbeiten. Wie löse ich dieses Problem? ich ahbe auch schon den Inhalt der onInitialize()-Methode im Kontruktor der Basis-Fenster-Klasse eingefügt, aber das passiert dasselbe.

Ich würde mich über Lösungsvorschläge freuen. Hier nochmal der Quellcode, diesmal mit der Erzeugung der Rows im jeweiligen Konstruktor:

Fenster-Basisklasse:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;

namespace EMSApplication
{
    public class BaseWindow : Window
    {
        public Grid MainGrid
        {
            get { return this.mainGrid; }
            set { this.mainGrid = value; }
        } private Grid mainGrid;

        public RowDefinition rowDev1, rowDev2, rowDev3;

        public BaseWindow()
        {
            this.Height = 600;
            this.Width = 800;
            mainGrid = new Grid();

            rowDev1 = new RowDefinition();
            rowDev1.Height = new GridLength(120);
            rowDev1.Name = "row1";

            rowDev2 = new RowDefinition();
            rowDev2.Height = new GridLength(100);
            rowDev2.Name = "row2";

            rowDev3 = new RowDefinition();
            rowDev3.Height = new GridLength(100);
            rowDev3.Name = "row3";

            mainGrid.RowDefinitions.Add(rowDev1);
            mainGrid.RowDefinitions.Add(rowDev2);
            mainGrid.RowDefinitions.Add(rowDev3);

            //StackPanel panel1 = new StackPanel();
            mainGrid.ShowGridLines = true;
            this.Content = mainGrid;
        }
    }
}

abgeleitetes fenster (XAML) :


<src:BaseWindow x:Class="EMSApplication.DerivedWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:src="clr-namespace:EMSApplication"
    Title="Derived Window" Height="300" Width="300">
    <!--<Grid>
        bleibt leer
    </Grid>-->
</src:BaseWindow>

abgeleitetes Fenster (CodeBehind):


using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace EMSApplication
{
    /// <summary>
    /// Interaktionslogik für WindowWithMenu.xaml
    /// </summary>
    public partial class WindowWithMenu : BaseWindowNew
    {
        public RowDefinition rowDev4;

        public WindowWithMenu()
        {
            InitializeComponent();
            rowDev4 = new RowDefinition();
            rowDev4.Name = "row4";
            rowDev4.Height = new GridLength(250);
            MainGrid.RowDefinitions.Add(rowDev4);
        }
    }
}

05.03.2008 - 09:54 Uhr

Hallo,

ich habe folgendes Problem: Ich entwickle gerade eine Browser-Anwendung (xbap). Diese benötigt die Funktionalität, Daten aus einer entfernten Datenbank zu verwalten. Wenn ich jetzt in den Projekteigenschaften im Visual Studio 2008 auf "voll vertrauenswürdige Anwendung" umschalte, was ich ja benötige, um z.b. eine SQLClientPermission zu bekommen, bekomme ich nach der Veröffnentlichung auf meinem lokalen Webserver unter Vista die Meldung, dass die Vertrauenswürdigkeit nicht sichergestellt ist. Wie bekomme ich diese Anwendung trotzdem zum laufen? ich dachte, bei einer voll vertrauenswürdigen Anwendung wird der Anwender gefragt, ob die Permissions gesetzt werden sollen oder nicht, oder kann man das viell über ein Zertifikat steuern? In meinem Projekt finde ich auch eine TestApp_TemporaryKey.pfx Datei, kann man damit viell.etwas anfangen? Ich möchte meine Applikation ungern nur mithilfe von Webservices auf entfernte Datenquellen zugreifen lassen.

Ich bin sehr neu auf dem Gebiet .NET 3.0/3.5.

Vielen Dank für etwaige Hilfe

Gruß, Micha

21.02.2008 - 10:47 Uhr

Hallo,

ich erstelle gerade die Oberfläche für eine xbap Anwendung, dabei habe ich folgendes Problem: ich möchte unterhalb eines header images eine menüleiste erzeugen, die jedoch noch ein Teil des Bildes überlappt. Ich möcht nun die opacity des menu auf 0 setzen, jedoch verschwinden dann die einzelnen menu header, obwohl deren opacity auf 1 gesetzt sind. Kann man das irgendwie trotzdem steuern, dass die opacity des menu nicht auf die einzelnen Kindelemente vererbt werden?

hier der Inhalt unterhalb des Page-Elementes:


<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="100" />
            <RowDefinition Height="25" />
            <RowDefinition Height="100*" />
        </Grid.RowDefinitions>
        <Image Grid.Row="0" Grid.RowSpan="2" Name="image1" Stretch="Fill" MaxWidth="800" MaxHeight="125"
               Source="hdrPicture.jpg" />
        <Menu VerticalAlignment="Center" HorizontalAlignment="Center" Name="menu" Grid.Row="1" Opacity="0">
            <MenuItem Name="mnuPerson" Header="person" Opacity="1" ClipToBounds="False">
                <MenuItem Header="new person" Name="mnuPersonNew" Click="mnuPerson_Click"></MenuItem>
                <MenuItem Header="open person" Name="mnuPersonOpen" Click="mnuPerson_Click"></MenuItem>
                <MenuItem Header="save person" Name="mnuPersonSave" Click="mnuPerson_Click"></MenuItem>
            </MenuItem>
        </Menu>
        <Frame Name="frameContent"></Frame>
    </Grid>

Danke für etwaige Hilfe und Gruß, Micha

06.02.2008 - 16:54 Uhr

Danke, hat geklappt... 😉

06.02.2008 - 14:11 Uhr

Hallo,

wie blende ich diese nervige Navigationsleiste mit den Forward/Back Buttons im IE6 aus, wenn ich eine xbap Anwendung ausführe? Wenn ich eine Page in ein Frame-Tag innerhalb eines Windows (normale WPF-Anwendung / exe) einbette, kann ich mit der Eigenschaft NavigationUIVisibility="Hidden" diese ausblenden. Wie mache ich das (wenns möglich ist) in einer Browseranwendung?

Gruß, Micha

06.02.2008 - 13:21 Uhr

ah..ok, und wo genau stell ich das um? Ich benutze übrigens VS 2008 Pro und finde diese Einstellung leider nicht.

Gruß, Micha

06.02.2008 - 13:04 Uhr

Hallo, folgendes (WPF-Newbie)-Problem:

Ich habe ein WPF Browseranwendungs-Projekt angelegt, zwei Pages erstellt und wollte nun versuchen, diese Pages in einem Window (Window1.xaml) zu integrieren, habe also ein Fenster (WPF) hinzugefügt, in den XAML-Code ein Frame eingefügt und die Source Eigenschaft auf "Page1.xaml" gesetzt. Darüber hinaus habe ich die StartupUri in der App.xaml auf "Window1.xaml" gesetzt. Beim Ausführen wird aber immer noch ein Browserfenster geöffnet und mit einer Fehlermeldung abgebrochen:

System.Security.SecurityException wurde nicht behandelt.
Message: Request for the permission of type 'System.Security.Permissions.UIPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.

In den Projekteigenschaften ist bei "Anwendung" auch das Feld Ausgabetyp ausgegraut. Gibts es doch eine Möglichkeit, innerhalb desselben Projektes das Fenster zu erzeugen?

Danke für Hilfe, Micha