Vielleicht hilft dir das ja schon mal weiter:
CorespondingTextEditor="{Binding ElementName=textEditor}"
Lg XXX
Genau das wars. Wusste nicht das Ich auch nur ElementName ohne Path verwenden kann....
Hallo, Ich hab folgendes XAML File:
Auszug:
<Controls:AWLOnlineStatusView
Margin="0 -23 0 0"
DockPanel.Dock="Right"
HorizontalAlignment="Right"
Visibility="{Binding DisplayNetwork.Parent.DiagnosticData,ElementName=NetworkEditorWindow,TargetNullValue=Collapsed,FallbackValue=Collapsed, Converter={StaticResource NullCollapsedConverter}}"
CorespondingTextEditor="blablabla"
DisplayNetwork="{Binding DisplayNetwork,ElementName=NetworkEditorWindow}">
</Controls:AWLOnlineStatusView>
<avalonEdit:TextEditor
HorizontalAlignment="Stretch"
BorderBrush="DarkGray"
BorderThickness="1"
Name="textEditor"
FontFamily="Consolas"
FontSize="10pt"
IsReadOnly="True"
ShowLineNumbers="True"
MouseHover="textEditor_MouseHover"
MouseHoverStopped="textEditor_MouseHoverStopped"
Visibility="Visible"
VerticalScrollBarVisibility="Hidden"
HorizontalScrollBarVisibility="Hidden">
</avalonEdit:TextEditor>
Nun möchte Ich an die Property CorespondingTextEditor von Controls:AWLOnlineStatusView das AvalonEdit Control übergeben.
Aber einfach CorespondingTextEditor="textEditor" geht ja nicht, ist mir auch klar. Wollte nur wissen ob es eine Markup extension gibt mit der sowas geht, Binding geht ja nicht, da Ich nur Properties Binden kann, aber textEditor ist ja ein Objekt!
Habs jetzt mal so probiert:
public class CustomCollectionEditor<T> : CollectionEditor
{
public CustomCollectionEditor(): base(typeof(List<T>))
{ }
public void ShowDialog()
{
CollectionForm frm = base.CreateCollectionForm();
CreateInstance(typeof(TCPFunctions.QuittConfig.QuittText));
frm.ShowDialog();
}
}
So kann Ich den Dialog zwar öffnen aber Ich muss ja irgendwie meine Liste zuweisen, woher die Daten kommen, und wohin gespeichert werden soll...
Ja den von VS!
Zur Laufzeit!
Hallo,
Ich habe eine Klasse welche sich aus 2 Primitiven Typen zusammensetzt. (Klasse A)
Nun habe Ich noch eine weitere Klasse, welche eine Liste der Ersten Klasse (A) enthält. (Klasse B)
Nun möchte Ich für die Liste der Klasse B den Collection Editor aufrufen um diese zu modifizieren! Ist das möglich, wenn ja wie? (Also nicht aus einem PropertyGrid heraus, sondern druck druck auf eine Schaltfläche)
Jetzt gehts...
Das Problem ist das Automatic Properties und LayoutKind.Sequential nicht zusammen funktionieren!
Nach umstellung auf Properties mit einer Variablen gehts!
Habe folgende Klasse:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public class xy11Dataset : SZLDataset
{
public short Index { get; set; }
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
private string _mlfB;
public string MlfB
{
get { return _mlfB; }
set { _mlfB = value; }
}
public UInt16 BGTyp { get; set; }
public UInt16 Ausbg1 { get; set; }
public UInt16 Ausbg2 { get; set; }
}
und mit folgendem Code befülle Ich sie:
(Auszug)
byte[] objBuffer = new byte[retVal.Size];
Array.Copy(buffer, (n*retVal.Size) + 8, objBuffer, 0, retVal.Size);
GCHandle handle = GCHandle.Alloc(objBuffer, GCHandleType.Pinned);
datsets.Add((xy11Dataset)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(xy11Dataset)));
handle.Free();
Nun ist das Problem, das im String nichts drinn steht! Wenn Ich aber im Debug objBuffer ansehe, ist da serwohl was drinnen.
Auch die Werte danach z.B. BGTyp erhalten den richtigen wert, d.h. die Länge des Strings wird richtig berücksichtigt, er ist nur leer!
Einer ne Idee???
EDIT: Hier noch die Basiklasse, falls dies Interessiert:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public abstract class SZLDataset
{
}
Nein Eben nicht, in der Liste sind immer die gleichen Objekte! Es kann nur sein einmal ist dieser Typ drin, einmal jener, aber immer die gleichen!
Habs gelöst.
Machs nun per Code:
if (szlData.SZLDaten.Length>0)
{
foreach (var prpInfo in szlData.SZLDaten[0].GetType().GetProperties())
{
myDataGrid.Columns.Add(new DataGridTextColumn() {Binding = new Binding(prpInfo.Name), Header = prpInfo.Name});
}
}
myDataGrid.ItemsSource = szlData.SZLDaten;
Ich brauch keine ObservableCollection, das ist auch nicht möglich, da meine Klasse .Net2.0 ist welche dies noch nicht kann!
Aber das würde auch mein Grundsätzliches Problem noch nicht lösen, da die ObservableCollection wieder vom Typ aa wäre wenn sie bb oder cc elemente enthält!
Nochmal genauer.
Hab Klasse
abstract class aa {}
class bb:aa {}
class cc:aa {}
Nun habe ich ein Array von aa welches ich der liste zuweise.
In dem Array sind entweder nur Objekte von bb oder cc.
Nun müsste Ich die Liste nach bb[] oder cc[] casten, aber ohne das ich das für alle klassen in einem switch einbauen muss (es gibt noch viel mehr!)
also sowas wie:
aa[] blabla= get....
mygrid.ItemsSource = (blabla.GetType() as Array)blabla;
Gibts sowas in die Richtung?
Das Problem ist das Ich ein Generisches Interface Habe, welches alle Klassen implementieren.
Und nun binde Ich eine Liste dieser Generischen Klasse an die Liste. Die Generische Klasse hat aber keine Felder, daher zeigt das Datagrid auch nichts an!
Die Liste enthält aber immer nur Klassen des gleichen Typs, wie kann Ich nun sagen das ein bestimmter typ zum erzeugen der columns verwendet werden kann! Der Typ kann aber bei jeder anfrage ein neuer sein!
Ist es möglich eine Benutzerdefinierte Structure so an ein DataTable zu binden, so das jede public Eigenschaft der Structure als Column dargestellt wird?
sollte sich mit dem IsBrowsable Attribut regeln lassen!
Oder kennt vielleicht noch jemand alternativen????
Grüße Pico
Das gibt's auch noch:
>
Du musst dir ja auch keine eigene klasse erstellen! Über die methode SetData kannst du beliebig viele objekte einem dataobjekt hinzufügen!
Jo danke David, genau das hab Ich gesucht!
Gibt es irgendeine einfache Möglichkeit in einem Datatemplate den Index des aktuellen ListBox Eintrages zu ermitteln, so das man diesen mit darstellen kann?
Das Problem war, das der DataContext in meinem UserControl auf this gesetzt wurde!!
Wenn Ich das DataTemplate weglasse, dann zeigt er mir in der ListBox meine Network Klassenennamen an, also bekommt die Liste Network Instanzen zugewiesen!
Ich seh einfach meinen Fehler nicht!
Hab jetzt gerade an mein Binding einen ValueConverter gehängt, zum Debuggen.
Er bleibt dann stehen, und value ist vom Typ "NetworkEditor", mein UserControl! Sollte Value nicht vom Typ "Network" sein wenn Ich an die ListBox eine List<Network> als ItemsSource zuweise?
public class DatabindingDebugConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
Debugger.Break();
return value;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
Debugger.Break();
return value;
}
}
Jo habs jetzt festgestellt, hab gesehen, das der Property immer "null" zugewiesen wird!
Das Versteh Ich aber nicht, meiner ListBox weisse Ich im ItemsSource eine List<Network> zu. Dann werden auch soviel Instanzen von meinem UserControl erzeugt, aber immer der DisplayNetwork Property null zugewiesen!
Habe ein WPF userControl:
wo Ich eine Property definiere:
public Network DisplayNetwork
{
get { return (Network)GetValue(DisplayNetworkProperty); }
set { SetValue(DisplayNetworkProperty, value); }
}
// Using a DependencyProperty as the backing store for DisplayNetwork. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DisplayNetworkProperty =
DependencyProperty.Register("DisplayNetwork", typeof(Network), typeof(NetworkEditor), new FrameworkPropertyMetadata(null, OnDisplayNetworkChanged));
Nun erzeuge Ich in einem ListView DataTemplate eine Instanz meines Usercontrols, wo Ich auch diese Property zuweise:
<ListBox Name="myLst" Grid.Row="3" >
<ListBox.ItemTemplate>
<DataTemplate>
<NetworkEditor:NetworkEditor DisplayNetwork="{Binding}" HorizontalAlignment="Stretch"></NetworkEditor:NetworkEditor>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
die ListView ItemsSource wird im Code gesetzt.
Es werden dann auch Instanzen meines UserControls im Fenster angezeigt, jedoch wird OnDisplayNetworkChanged nicht aufgerufen! Was mach Ich falsch?
Was will Ich erreichen:
Ich habe einen Tree mit Objekten. Der User kann nun auf den Tree ein anderes Obekt ziehen, aber er kann es i jede beliebige Ebene des Trees ziehen, doch es soll dann auf einer ganz bestimmten Ebene einsortiert werden (eben auf der Ebene, welcher das zugehörige Objekt einem bestimmten Typ entspricht.). Aber es gibt nur ein HirachicalDatatemplate, d.h. alle TreevieItems sind vom gleichen Typ, die zugrundeliegenden Objekte aber nicht (sie haben nur die gleiche Basisklasse!)
Es funzt nun auch!
geht ja ganz einfach:
TreeViewItem.Items.Refresh();
wobei Ich noch mit der TryFindParent Extension Methode das übergeordnete TreeViewItem rausfinde!
Kann Ich nicht nur einem TreeViewItem sagen, das es seine SubItems neu laden soll?
Ich habe ein TreeView welcher an Klassen gebunden ist, welche nur List<T> implementieren und nicht ObservableCollection<T>.
Kann aber auch nicht ObservableCollection<T> implementieren, da die Grundobjekte in einer Asembly sind welche nur .NET2.0 unterstützt!
Gibt es eine möglichkeit den TreeView zum neu laden zu zwingen?
Ok, habs....
Code gibts hier:
http://forums.silverlight.net/forums/p/65277/282851.aspx
da sind aber bei der Funktion ItemFromContainer noch Bugs drin.
Hier meine geänderte Version:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
namespace WPFToolboxForPLCs.WPF_Addons
{
public static class TreeViewExtensions
{
public static TreeViewItem ContainerFromItem(this TreeView treeView, object item)
{
TreeViewItem containerThatMightContainItem = (TreeViewItem)treeView.ItemContainerGenerator.ContainerFromItem(item);
if (containerThatMightContainItem != null)
return containerThatMightContainItem;
else
return ContainerFromItem(treeView.ItemContainerGenerator, treeView.Items, item);
}
private static TreeViewItem ContainerFromItem(ItemContainerGenerator parentItemContainerGenerator, ItemCollection itemCollection, object item)
{
foreach (object curChildItem in itemCollection)
{
TreeViewItem parentContainer = (TreeViewItem)parentItemContainerGenerator.ContainerFromItem(curChildItem);
if (parentContainer == null)
return null;
TreeViewItem containerThatMightContainItem = (TreeViewItem)parentContainer.ItemContainerGenerator.ContainerFromItem(item);
if (containerThatMightContainItem != null)
return containerThatMightContainItem;
TreeViewItem recursionResult = ContainerFromItem(parentContainer.ItemContainerGenerator, parentContainer.Items, item);
if (recursionResult != null)
return recursionResult;
}
return null;
}
public static object ItemFromContainer(this TreeView treeView, TreeViewItem container)
{
var itemThatMightBelongToContainer = treeView.ItemContainerGenerator.ItemFromContainer(container);
if (itemThatMightBelongToContainer != null && itemThatMightBelongToContainer != DependencyProperty.UnsetValue)
return itemThatMightBelongToContainer;
else
return ItemFromContainer(treeView.ItemContainerGenerator, treeView.Items, container);
}
private static object ItemFromContainer(ItemContainerGenerator parentItemContainerGenerator, ItemCollection itemCollection, TreeViewItem container)
{
foreach (object curChildItem in itemCollection)
{
TreeViewItem parentContainer = (TreeViewItem)parentItemContainerGenerator.ContainerFromItem(curChildItem);
if (parentContainer == null)
return null;
var itemThatMightBelongToContainer = parentContainer.ItemContainerGenerator.ItemFromContainer(container);
if (itemThatMightBelongToContainer != null && itemThatMightBelongToContainer != DependencyProperty.UnsetValue)
return itemThatMightBelongToContainer;
var recursionResult = ItemFromContainer(parentContainer.ItemContainerGenerator, parentContainer.Items, container);
if (recursionResult != null)
return recursionResult;
}
return null;
}
}
}
Ich habe ein TreeViewItem, dies wurde jedoch von WPF durch ein Datatemplate erzeugt!
Nun möchte Ich zu diesem Item das Zugehörige Objekt, also das Objekt auf das das DataTemplate angewendet wurde! Wie ist das möglich?
Musste noch
private void myDataGrid_GiveFeedback(object sender, GiveFeedbackEventArgs e)
{
e.Handled = true;
Mouse.OverrideCursor = dragDropCursor;
}
hinzufügen nun gehts...
Ich denke darin kann Ich nun auch prüfen ob das Ziel DragDrop unterstützt und den Cursor ändern...
Jetzt brauch Ich nur noch die Möglichkeit die Standart DragDrop Cursor auszulesen, und dann mit meinem Custom Cursor zu kombinieren, so das mein Cursor leicht rechts nach unten versetzt zum default cursor angezeigt wird.
Kenn jemand ne API-Funktion um die default DragDrop Cursor auszulesen?
Nach ein paar suchen und div. Tests läufts nun.
Hier mein XAML und Code falls es jemand auch braucht...
(Das ist nicht alles auf meinem Mist gewachsen, habs aus div Quellen im Inet!)
<ad:DockableContent x:Class="WPFToolboxForPLCs.DockableWindows.DockableContentProjectList" 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" xmlns:ad="clr-namespace:AvalonDock;assembly=AvalonDock" xmlns:Projects="clr-namespace:LibNoDaveConnectionLibrary.DataTypes.Projects;assembly=LibNoDaveConnectionLibrary" xmlns:Projectfiles="clr-namespace:LibNoDaveConnectionLibrary.Projectfiles;assembly=LibNoDaveConnectionLibrary" xmlns:WPFToolboxForPLCs="clr-namespace:WPFToolboxForPLCs" xmlns:local="clr-namespace:WPFToolboxForPLCs.WPF_Addons" xmlns:s="clr-namespace:System;assembly=mscorlib" mc:Ignorable="d" d:DesignHeight="339" d:DesignWidth="482">
<ad:DockableContent.Resources>
<local:TreeViewLineConverter x:Key="LineConverter" />
<SolidColorBrush x:Key="GlyphBrush" Color="#444" />
<Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
<Setter Property="Focusable" Value="False" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border Background="#00FFFFFF" Width="19" Height="13">
<Border BorderThickness="1,1,1,1" CornerRadius="1,1,1,1" BorderBrush="#FF7898B5" Width="9" Height="9" SnapsToDevicePixels="True">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFFFFFFF" Offset="0.2" />
<GradientStop Color="#FFC0B7A6" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<Path Data="M0,2L0,3 2,3 2,5 3,5 3,3 5,3 5,2 3,2 3,0 2,0 2,2z" Fill="#FF000000" Name="ExpandPath" Margin="1,1,1,1" />
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="ToggleButton.IsChecked">
<Setter Property="Path.Data" TargetName="ExpandPath">
<Setter.Value>
<StreamGeometry>M0,2L0,3 5,3 5,2z</StreamGeometry>
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>True</s:Boolean>
</Trigger.Value>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="TreeViewItemFocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Border>
<Rectangle Margin="0,0,0,0" StrokeThickness="5" Stroke="Black" StrokeDashArray="1 2" Opacity="0" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ad:DockableContent.Resources>
<TreeView Name="myTreeView" ItemsSource="{Binding Projects}" MouseDoubleClick="TreeView_MouseDoubleClick">
<TreeView.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/PresentationFramework.Luna, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/luna.normalcolor.xaml" />
</ResourceDictionary.MergedDictionaries>
<HierarchicalDataTemplate DataType="{x:Type Projects:ProjectFolder}" ItemsSource="{Binding SubItems}">
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="HorizontalContentAlignment" Value="{Binding Path=HorizontalContentAlignment,
RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
<Setter Property="VerticalContentAlignment" Value="{Binding Path=VerticalContentAlignment,
RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
<Setter Property="Padding" Value="1,0,0,0" />
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
<Setter Property="FocusVisualStyle" Value="{StaticResource TreeViewItemFocusVisual}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TreeViewItem}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="19" Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<!-- Connecting Lines -->
<Rectangle x:Name="HorLn" Height="1" Stroke="#8888" Margin="10,0,0,0" SnapsToDevicePixels="true" />
<Rectangle x:Name="VerLn" Width="1" Stroke="#8888" Grid.RowSpan="2" SnapsToDevicePixels="true" />
<ToggleButton x:Name="Expander" Style="{StaticResource ExpandCollapseToggleStyle}" IsChecked="{Binding Path=IsExpanded,
RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press" />
<Border Name="Bd" Grid.Column="1" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
<ContentPresenter x:Name="PART_Header" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" />
</Border>
<ItemsPresenter x:Name="ItemsHost" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" />
</Grid>
<ControlTemplate.Triggers>
<!-- This trigger changes the connecting lines if the item is the last in the list -->
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource LineConverter}}" Value="true">
<Setter TargetName="VerLn" Property="Height" Value="6" />
<Setter TargetName="VerLn" Property="VerticalAlignment" Value="Top" />
</DataTrigger>
<Trigger Property="IsExpanded" Value="false">
<Setter TargetName="ItemsHost" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="HasItems" Value="false">
<Setter TargetName="Expander" Property="Visibility" Value="Hidden" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="HasHeader" Value="false" />
<Condition Property="Width" Value="Auto" />
</MultiTrigger.Conditions>
<Setter TargetName="PART_Header" Property="MinWidth" Value="75" />
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="HasHeader" Value="false" />
<Condition Property="Height" Value="Auto" />
</MultiTrigger.Conditions>
<Setter TargetName="PART_Header" Property="MinHeight" Value="19" />
</MultiTrigger>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="IsSelectionActive" Value="false" />
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
</MultiTrigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<StackPanel Orientation="Horizontal">
<WPFToolboxForPLCs:WinFormsImage ImageSource="{Binding FolderClosedImage}"></WPFToolboxForPLCs:WinFormsImage>
<TextBlock Text=" " />
<TextBlock VerticalAlignment="Center" FontFamily="Courier New" Text="{Binding Name}"></TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
</ResourceDictionary>
</TreeView.Resources>
</TreeView>
</ad:DockableContent>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows.Data;
namespace WPFToolboxForPLCs.WPF_Addons
{
class TreeViewLineConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
TreeViewItem item = (TreeViewItem)value;
ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(item);
return ic.ItemContainerGenerator.IndexFromContainer(item) == ic.Items.Count - 1;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new Exception("The method or operation is not implemented.");
}
}
}
Zu früh gefreut.
Wenn ich das DragDrop.DoDragDrop weglasse ändert sicher der Mauszeiger. Wenn Ich das aber wieder hinmache, wird der Mauszeiger wieder durch den Standart DragDrop Mauszeiger ersetzt!
ja das ist schon mal nicht schlecht...
Nun muss Ich irgendwie noch den aktuellen Mausecursor irgendwie als overlay drüberlegen...
Ja, will es auch nach Außen haben! Will auch in ne zweite Instanz meines Programmes und in den Explorer ziehen können!
Hallo, Ich will ein DragDrop aus einem DataGrid ermöglichen, und dabei den EIntrag welchen Ich selektiert habe dabei anzeigen.
Das normale DragDrop funzt auch ohne Probleme, nur das mit dem custom cursor (also der markierte EIntrag) macht probleme. Hab zwar im Internet schon ein paar beispiele dazu gefunden, diese funzen jedoch alle nur wenn ich nicht etwas aus dem WPF fenster heraus ziehen will (z.b. auf den desktop).
Hallo,
Ich befülle meinen TreeView per HierarchicalDataTemplate.
<HierarchicalDataTemplate DataType="{x:Type Projects:ProjectFolder}" ItemsSource="{Binding SubItems}">
<StackPanel Orientation="Horizontal">
<WPFToolboxForPLCs:WinFormsImage ImageSource="{Binding FolderClosedImage}"></WPFToolboxForPLCs:WinFormsImage>
<TextBlock VerticalAlignment="Center" FontFamily="Courier New" Text="{Binding Name}"></TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
Nun habe Ich aber noch das Problem das meine Klasse 2 Bilder zurückliefern würde, einmal FolderClosedImage und einmal FolderOpenedImage.
Kann das aber auch nicht im Style des TreeViewItems lösen, da das Bild nicht für alle
TreeViewItems gleich ist!
Ja, aber auch im XP-Style Fehlen mir die Verbindungslinien.
Habs mal in einem Bild angehängt:
Wenn man auf das Dreieck im Linken Kreis klickt, klappt der Treeview auf egal ob das Fenster ProjectTree den Focus hat oder nicht.
Beim Rechten Kreis klappt die Gruppe nur aus wenn das Fenster Bausteine den Focus hat!
Von welchem Fenster soll Ich den nun Source einstellen?
Hab mal den Quellcode vom DataGrid.Goupstyle angehängt!
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=Name}" />
</StackPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander>
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name}" />
<TextBlock Text=" ("/>
<TextBlock Text="{Binding Path=ItemCount}"/>
<TextBlock Text=" Items)"/>
</StackPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
Ja, hab den kompletten style vom Inspector kopiert.
Das einzigste was Ich grad geändert habe ist die PathGeometry... (spiel da grad mit rum um ein Plus draus zu machen...
<Style TargetType="{x:Type TreeViewItem}" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style.Triggers>
<Trigger Property="VirtualizingStackPanel.IsVirtualizing">
<Setter Property="ItemsControl.ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<VirtualizingStackPanel IsItemsHost="True" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>
True</s:Boolean>
</Trigger.Value>
</Trigger>
</Style.Triggers>
<Style.Resources>
<ResourceDictionary />
</Style.Resources>
<Setter Property="Panel.Background">
<Setter.Value>
<SolidColorBrush>
#00FFFFFF</SolidColorBrush>
</Setter.Value>
</Setter>
<Setter Property="Control.HorizontalContentAlignment">
<Setter.Value>
<Binding Path="HorizontalContentAlignment" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ItemsControl, AncestorLevel=1}" />
</Setter.Value>
</Setter>
<Setter Property="Control.VerticalContentAlignment">
<Setter.Value>
<Binding Path="VerticalContentAlignment" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ItemsControl, AncestorLevel=1}" />
</Setter.Value>
</Setter>
<Setter Property="Control.Padding">
<Setter.Value>
<Thickness>
1,0,0,0</Thickness>
</Setter.Value>
</Setter>
<Setter Property="TextElement.Foreground">
<Setter.Value>
<DynamicResource ResourceKey="{x:Static SystemColors.ControlTextBrushKey}" />
</Setter.Value>
</Setter>
<Setter Property="FrameworkElement.FocusVisualStyle">
<Setter.Value>
<Style TargetType="{x:Type IFrameworkInputElement}">
<Style.Resources>
<ResourceDictionary />
</Style.Resources>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TreeViewItem}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" MinWidth="19" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<ToggleButton IsChecked="False" ClickMode="Press" Name="Expander">
<ToggleButton.Style>
<Style TargetType="{x:Type ToggleButton}">
<Style.Resources>
<ResourceDictionary />
</Style.Resources>
<Setter Property="UIElement.Focusable">
<Setter.Value>
<s:Boolean>
False</s:Boolean>
</Setter.Value>
</Setter>
<Setter Property="FrameworkElement.Width">
<Setter.Value>
<s:Double>
16</s:Double>
</Setter.Value>
</Setter>
<Setter Property="FrameworkElement.Height">
<Setter.Value>
<s:Double>
16</s:Double>
</Setter.Value>
</Setter>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border Padding="5,5,5,5" Background="#00FFFFFF" Width="16" Height="16">
<Path Fill="#00FFFFFF" Stroke="#FF989898" Name="ExpandPath">
<Path.Data>
<PathGeometry Figures="M0,0L0,6L6,6L6,0z" />
</Path.Data>
<!--<Path.RenderTransform>
<RotateTransform Angle="135" CenterX="3" CenterY="3" />
</Path.RenderTransform>-->
</Path>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="UIElement.IsMouseOver">
<Setter Property="Shape.Stroke" TargetName="ExpandPath">
<Setter.Value>
<SolidColorBrush>
#FF1BBBFA</SolidColorBrush>
</Setter.Value>
</Setter>
<Setter Property="Shape.Fill" TargetName="ExpandPath">
<Setter.Value>
<SolidColorBrush>
#00FFFFFF</SolidColorBrush>
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>
True</s:Boolean>
</Trigger.Value>
</Trigger>
<Trigger Property="ToggleButton.IsChecked">
<Setter Property="UIElement.RenderTransform" TargetName="ExpandPath">
<Setter.Value>
<RotateTransform Angle="180" CenterX="3" CenterY="3" />
</Setter.Value>
</Setter>
<Setter Property="Shape.Fill" TargetName="ExpandPath">
<Setter.Value>
<SolidColorBrush>
#FF595959</SolidColorBrush>
</Setter.Value>
</Setter>
<Setter Property="Shape.Stroke" TargetName="ExpandPath">
<Setter.Value>
<SolidColorBrush>
#FF262626</SolidColorBrush>
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>
True</s:Boolean>
</Trigger.Value>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ToggleButton.Style>
</ToggleButton>
<Border BorderThickness="{TemplateBinding Border.BorderThickness}" Padding="{TemplateBinding Control.Padding}" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" Name="Bd" SnapsToDevicePixels="True" Grid.Column="1">
<ContentPresenter Content="{TemplateBinding HeaderedContentControl.Header}" ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}" ContentStringFormat="{TemplateBinding HeaderedItemsControl.HeaderStringFormat}" ContentSource="Header" Name="PART_Header" HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</Border>
<ItemsPresenter Name="ItemsHost" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="TreeViewItem.IsExpanded">
<Setter Property="UIElement.Visibility" TargetName="ItemsHost">
<Setter.Value>
<x:Static Member="Visibility.Collapsed" />
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>
False</s:Boolean>
</Trigger.Value>
</Trigger>
<Trigger Property="ItemsControl.HasItems">
<Setter Property="UIElement.Visibility" TargetName="Expander">
<Setter.Value>
<x:Static Member="Visibility.Hidden" />
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>
False</s:Boolean>
</Trigger.Value>
</Trigger>
<Trigger Property="TreeViewItem.IsSelected">
<Setter Property="Panel.Background" TargetName="Bd">
<Setter.Value>
<DynamicResource ResourceKey="{x:Static SystemColors.HighlightBrushKey}" />
</Setter.Value>
</Setter>
<Setter Property="TextElement.Foreground">
<Setter.Value>
<DynamicResource ResourceKey="{x:Static SystemColors.HighlightTextBrushKey}" />
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>
True</s:Boolean>
</Trigger.Value>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="TreeViewItem.IsSelected">
<Condition.Value>
<s:Boolean>
True</s:Boolean>
</Condition.Value>
</Condition>
<Condition Property="Selector.IsSelectionActive">
<Condition.Value>
<s:Boolean>
False</s:Boolean>
</Condition.Value>
</Condition>
</MultiTrigger.Conditions>
<Setter Property="Panel.Background" TargetName="Bd">
<Setter.Value>
<DynamicResource ResourceKey="{x:Static SystemColors.ControlBrushKey}" />
</Setter.Value>
</Setter>
<Setter Property="TextElement.Foreground">
<Setter.Value>
<DynamicResource ResourceKey="{x:Static SystemColors.ControlTextBrushKey}" />
</Setter.Value>
</Setter>
</MultiTrigger>
<Trigger Property="UIElement.IsEnabled">
<Setter Property="TextElement.Foreground">
<Setter.Value>
<DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" />
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>
False</s:Boolean>
</Trigger.Value>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Hab jetzt mal mit StyleSnooper den OrginalStyle extrahiert und als Resource eingebunden. (als erster test, das ändern in ein plus kommt dann). Nun existiert das Problem, das sich der Expander nicht mehr öffnet wenn Ich auf das Dreieck klicke. Das Dreieck änder sich zwar als wäre er expandiert, aber der Inhalt erscheint nicht! Erst wenn Ich auf den Titel doppelklicke!
Ich nutze ein WPF DataGrid mit Gruppierten Items.
Die Items haben einen Expander. Das ganze befindet sich in einem AvalonDock Fenster. Wenn nun das Fenster mit dem Datagrid nicht den Focus hat, muss man 2 mal auf den Expander klicken, das er sich ausklappt.
In einem andern Fenster habe Ich einen TreeView, auf desen Expander muss Ich jedoch nur einmal klicken, auch wenn das Fenster nicht den Focus hat!
Ja, aber Ich will das mein TreeVie immer die Plus / Minus hat (auf jedem Rechner)!
Da gibts doch bestimmt irgendwo ein Template mit +/-
Ich nutzeein WPF TreeView, und der zeigt nur noch die hässlichen Dreiecke an. Gibts irgendwo ein Control Template mit Plus/Minus zum download?
Hat dann jm. Vielleicht eine Idee wie man das loesen koennte?
Ein Dattemplate für eine List<string> kann Ich ja folgendermasen anlegen:
<DataTemplate x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:PropertyGrid}, ResourceId={x:Type generics:List`1[System.String]}}">
</DataTemplate>
das funzt auch.
Nun wollte Ich fragen, ist es auch möglich ein Datatemplate für alle Klassen anzulegen die IEnumerable implementieren?
Danke.
Gibt es eine einfach möglichkeit eine Listbox sortierung anzupassen?
Wenn ich die ListBox sortieren lassen bekomme Ich folgedes ergebnis:
DB1
DB10
DB11
DB12
DB2
DB20
DB3
Ich hätte meine sortierung aber gern so:
DB1
DB2
DB3
DB10
DB11
DB12
DB20
gibts den da ne einfache Lösung?
ja das geht, wenn du dir einen eigenen SettingsProvider schreibst.
Infos dazu hier: Creating a Custom Settings Provider
Gibt es an einem Datengebundenen Treeview eine einfach Möglichkeit rauszufinden welche Elemente gerade sichtbar sind?
nun gehts, das Problem war, das das Root Element kein Aufzählungselement war!