Laden...
Avatar #avatar-2980.jpg
Taladan myCSharp.de - Member
Individualprogrammierer sowie Student Osnabrück Dabei seit 06.04.2008 582 Beiträge

Forenbeiträge von Taladan Ingesamt 582 Beiträge

29.07.2008 - 01:33 Uhr

Ich habe ein recht umfangreiches Projekt, bei dem ich nun eine XML-Datei als resource Einbinden möchte. Ich füge normal eine XML Deitei hinzu. Sie wird ja standartgemäß als resource eingebunden, so zumindest in der Build-Action angegeben.

Wenn ich jedoch im XAML die Datei mit einem XmlDataProvider ansteuern möchte, bekomme ich diese Fehlermeldung: "Die Datei "test.xml" ist nicht bestandteil des Projekts, oder ihre BuildAction-Eigenschaft ist nicht auf Resource eingestellt.

Dummerweise trifft doch beides zu?

Dies ist allerdings nur bei relativen Pfad so. Wenn ich den absoluten verwende habe ich keine Probleme.

Kann wer helfen?

Hab ein neues Testprojekt gestartet, da funktionieren die XAML anweisungen optimal.

28.07.2008 - 00:24 Uhr

Und genau das war das Problem. Warum erst die Sachen in ein Objekt verwandeln, wenn man gleich XML-Bindung verwenden kann. Wie üblich war es ganz Simpel, aber ich bin grad erst auf lösung geplumpst.

Die externe XML Datei


<?xml version="1.0" encoding="utf-8" ?>
<Root xmlns="">
  <Page Titel="Startseite" Nr="1"/>
  <Rubrik Titel="Tools">
    <Page Titel="Tool1" />
  </Rubrik>
  <Page Titel="Optionen" Nr="0" />
</Root>

Und alles über XAML geregelt ohne eine Zeile Code 🙂


 <Window.Resources>
        <XmlDataProvider x:Key="Menu" Source="C:\Users\Marco\Documents\Visual Studio 2008\Projects\Meistertools\Meistertools\TableOfContent.xml"/>

        <HierarchicalDataTemplate DataType="Page" ItemsSource="{Binding XPath=Rubrik|Page}">
            <TextBlock Text="{Binding XPath=@Titel}" />
        </HierarchicalDataTemplate>


        <HierarchicalDataTemplate DataType="Rubrik" ItemsSource="{Binding XPath=Rubrik|Page}">
            <TextBlock Text="{Binding XPath=@Titel}" />
        </HierarchicalDataTemplate>
        
    </Window.Resources>
    <DockPanel>
        <TreeView x:Name="tvMenu" ItemsSource="{Binding Source={StaticResource Menu}, XPath=Root/Page|Root/Rubrik}"  DockPanel.Dock="Left" Width="200">
        </TreeView>
    </DockPanel>

27.07.2008 - 23:22 Uhr

Ich möchte gerne diesen Dataprovider an ein Treeview binden. Und zwar soll immer der Titel ausgegeben werden. Jedoch klappt dies irgendwie icht.


  <XmlDataProvider x:Key="Menu2">
            <x:XData>
                <Fenster Title="Menu" Nr="6">
                    <Seite Page="Seiten\Kalender\Kalender.xaml" Title="Kalender" Nr="5" />
                    <Seite Page="StartSeite.xaml" Title="Startseite" Nr="1" />
                    <Seite Page="Seiten\Kontakte\KontakteSeite.xaml" Title="Kontakte und mehr" Nr="3" >
                        <Seite Titel="Adressen" Nr="5" />
                        <Seite Titel="Personen" Nr="8">
                            <Seite Titel="Privat" Nr="9" />
                            <Seite Titel="Verein" />
                            <Seite Titel="Gruppe" />
                        </Seite>
                    </Seite>
                    <Seite Page="Seiten\Textbausteine\Textbausteine.xaml" Title="Textbausteine" Nr="4" />
                    <Seite Page="Seiten\Optionen\Optionen.xaml" Title="Optionen" Nr="0" />
                </Fenster>
            </x:XData>
        </XmlDataProvider>


<HierarchicalDataTemplate DataType="Seite">
            <TextBlock Text="{Binding XPath=@Title}" />
        </HierarchicalDataTemplate>

<TreeView x:Name="tvMenu" ItemsSource="{Binding Source={StaticResource Menu2}, XPath=Fenster}"  DockPanel.Dock="Left" Width="200">
          
        </TreeView>

27.07.2008 - 01:22 Uhr

Falsch.

Ein UserControl ist mehr oder Weniger ein Pinbrett wo deine Controls einzel drauf packen kannst, genau so wie bei einer Page oder Window. Du kannst dieses UserControl wie ein normales Control einbinden. Lohnenswert z.B. für häufig verwendete Kombinationen mehrer Controls. Typische Beispiel wären z.B. Login-Bereich (2 Textboxen und 2 Labels) der auf mehreren Forms verwendet wird.

Unter einen CustomControl versteht man eine abgeleitete Klasse eines vorhandenen Controls (über umwegen ist obriges allerdings auch möglich) um diese zu Erweitern. Z.B. um aus einer Normalen TextBox eine MaskTextBox zu machen.

Beide Elemente kann man mit Propertys und Eventhandler aufmotzen wie man lustig ist.

Theoretisch (so war es vor WPF) ist das was man mit Templates, Styles oder Trigger macht, nicht anderes als die Erstellung eines individuellen CustomControls, was früher nur durch aufwendiges Coding, Berechnungen und überschreiben von komplizerten Paint-Ereignissen sowie entsprechendes Debugging. In diesen Bereich (und durch die starke Verschachtelungsmöglichkeit der ControlElemente) wird das CustomControl nicht mehr gebraucht und verliert sogar fast seine Existentsberechtigung, da es kaum noch notwendig ist, ein eigenes Control zu erstellen.

Erst wenn man sich tiefer eingräbt ins Coding muß man selten ein CC erstellen. UC kommen jedoch häufiger vor. Insbesondere dann, wenn man über mehrere Pages/Windows/Projekte entsprechende Komponenten identisch Aussehen zu lassen.

27.07.2008 - 01:07 Uhr

Das liegt daran das Windows Forms auf einer anderen Basis gecodet wurde. Der Grund ist relativ Simpel. Auf jeden WPF tauglichen Rechner sind auch die Bibliotheken für Forms aber nicht umgekehrt ist das nicht Sichergestellt (Windows Forms funktioniert auch auf Win95(?), mit .Net erst ab WinXP mit Framework; WPF erst ab XP SP/2 mit .Net 3.5 Framework) . Man müßte schon einen Schnittstelle verwenden. Dazu findest du dutzende Beispiele (zumindest für Komponenten) im Netz.

27.07.2008 - 00:50 Uhr

Hallo ich möchte gerne folgende Resource in ein Dictonary packen. Das Problem ist, weil zwei Events definiert werden müssen, da das Objekt sonst nicht ordnungsgemäß funktioniert.
(ich habe es auch schon mit einer eigenen Komponente Probiert, wo es Darstellungsprobleme gab).


        <SolidColorBrush x:Key="TabControlNormalBorderBrush" Color="#919B9C"/>
        <Style x:Key="TabControlStyle" TargetType="{x:Type TabControl}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabControl}">
                        <Grid ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition x:Name="ColumnDefinition0"/>
                                <ColumnDefinition x:Name="ColumnDefinition1" Width="0"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition x:Name="RowDefinition0" Height="Auto"/>
                                <RowDefinition x:Name="RowDefinition1" Height="*"/>
                            </Grid.RowDefinitions>
                            <Grid Grid.Column="0" Grid.Row="0" >
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>
                                <TabPanel Grid.Column="0"
                                    Margin="2,2,2,0" x:Name="HeaderPanel"
                                    IsItemsHost="true"
                                    Panel.ZIndex="1"
                                    KeyboardNavigation.TabIndex="1"
                                    />
                                <ComboBox Grid.Column="1" BorderBrush="Black" ItemsSource="{Binding ElementName=Content, Path=Items}" SelectionChanged="TabSelection_Change" Width="18">
                                    <ComboBox.ItemTemplate>
                                        <DataTemplate>
                                            <WrapPanel>
                                                <TextBlock Text="{Binding Path=Header}"/>
                                            </WrapPanel>
                                        </DataTemplate>
                                    </ComboBox.ItemTemplate>
                                </ComboBox>
                                <Button Content="X" Grid.Column="2" Click="btnCloseTab_Click" BorderBrush="Black" Width="18" Margin="0,0,2,0"/>
                            </Grid>
                            <Border x:Name="ContentPanel" Grid.Column="0" Grid.Row="1" BorderBrush="#D0CEBF" BorderThickness="0,0,1,1" KeyboardNavigation.DirectionalNavigation="Contained" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local">
                                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                                    <Border Background="{TemplateBinding Background}">
                                        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Margin="{TemplateBinding Padding}" x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
                                    </Border>
                                </Border>
                            </Border>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

21.07.2008 - 15:57 Uhr

Ok. Hatte einen folgeverweiß übersehen. Nun klappts 🙂.

21.07.2008 - 13:38 Uhr

Entweder stehe ich völlig auf dem falschen Schlauch oder du hast mich in der tat falsch verstanden.

Ich habe in meinen Hauptfenster die Navigation und ein Frame liegen. In diesen Frame lade ich bestimmte Seiten, welche durch selektiren eines ListviewElements (die Navigation) ausgewählt werden. Diese werden wiederum im Hauptfenster mit im Titel angezeigt, sowie innerhalb des Navigationsmenus entsprechend gekennzeichnet.

Ich weiß wie man per NavigationService.Navigate in ein anderes Objekt navigieren kann. Jedoch ändern sich dadurch verständlicherweise nicht der Titel des Hauptfensters, geschweige den die Markierungen im Navigationsmenus.

Meine Idee war nun, im Hauptfenster entsprechende Prozeduren bereit zu stellen, wodurch ich das selektieren innerhalb der Navigation manuell festlegen kann (quasi das selektieren) und sich dadurch dann automatisch die anderen Probleme von alleine Lösen.

21.07.2008 - 12:46 Uhr

Ich möchte gern von meiner Page auf das Hauptfenster zu greifen. Beide sind bereits inialisiert, wärend des Ereignisses. Genauer möchte ich vom Hauptfenster eine Prozedur ausführen, weiß aber net, wie ich die definieren muß, um von anderen Fenstern/Seiten diese benutzen kann.

21.07.2008 - 00:15 Uhr

Wie man Bilder über ein ValueConverter Binden kann, findest du hier

21.07.2008 - 00:08 Uhr

Ich hoffe du hast dafür nicht wirklich ein eigenes Control geschrieben sondern ein UserControl verwendet.

Wichtige Eigenschaften wie IsTabStop = True, und der Tabindex (dieser legt die Reihenfolge fest) hast du schon entdeckt? Meisten scheiterts bei UC daran. Diese mußt du sowohl bei dem UserControl einstellen, wie auch bei den verwendeten Komponenten.

20.07.2008 - 23:51 Uhr

Des Teufels Lösung:

BitmapImage.UriSource muß in einen BeginInit und EndInit-Block stehen. Warum ist mir unklar, aber nun funktioniert es.


 <Image Name="_Image_Dokument" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="5" MaxHeight="100" MaxWidth="100" HorizontalAlignment="Center" MouseUp="_Image_Dokument_MouseUp" >
                                        <Image.Source>
                                            <Binding Path="Dateiname" Converter="{StaticResource convertImagePath}"/>
                                        </Image.Source>
                                        <Image.ToolTip>
                                                <Image Name="_Image_ToolTip" MaxHeight="800" Height="Auto" MaxWidth="800" Width="Auto" DockPanel.Dock="Top">
                                                    <Image.Source>
                                                        <Binding Path="Dateiname" Converter="{StaticResource convertImagePath}" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
                                                    </Image.Source>
                                                </Image>
                                        </Image.ToolTip>
                                    </Image>


 public class ImagePathConverter : IValueConverter
    {
        #region IValueConverter Member

        object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string path= Bewerbungsmanager.Properties.Settings.Default.Dokumentenpfad + "\\" + Convert.ToString(value);
            BitmapImage bi = new BitmapImage();
           
            bi.BeginInit();
            bi.UriSource = new Uri(path, UriKind.RelativeOrAbsolute);
            bi.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad;
            bi.EndInit();
            return bi;
        }

        object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return null;
        }

        #endregion

10.07.2008 - 23:48 Uhr

Hatte ich auch schon probiert. ohne erfolg.

10.07.2008 - 15:07 Uhr

Hallo,

ich nutze ein Frame für die Anzeige meiner Programmseiten. Das funktioniert Wunderbar. Doch wie kann ich aus einer Programmseite dem Hauptfenster nun den Befehl geben, das ich das Frame geändert haben will? Das wechseln aus den Hauptfenster heraus ist simpel. Aber ich kann ja von der Page nicht aufs Hauptfenster zu greifen.

Gruß Marco

Aufbau:
Hauptfenster mit Frame

Diverse Page´s werden mit dem Frame aufgerufen.
z.B.
Kontakte
Adressen

Ich möchte von über ein Button in Kontakte dem Frame im Hauptfenster den Befehl geben, die Seite Adressen zu öffnen.

10.07.2008 - 12:49 Uhr

Habs jetzt auf zwei verschiedene arten probiert. Einmal über WPF und einmal über CodeBehind. Beides führte nicht zu dem gewünschten Ergebnis.

Code


 public class ImagepathToBitmapConverter : IValueConverter
    {
        #region IValueConverter Member
        object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            try
            {
                BitmapImage bmp = new BitmapImage(new Uri(Bewerbungsmanager.Properties.Settings.Default.Dokumentenpfad + "\\" + Convert.ToString(value)));
                bmp.CacheOption = BitmapCacheOption.None;
                return bmp;
            }
            catch 
            {
                //MessageBox.Show("Es ist ein fehler aufgetreten: " + Environment.NewLine + Environment.NewLine + ex.ToString());
            }
            return null;

        }

        object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return null;
        }

        #endregion
    }

Über WPF bekomme ich immer die Fehlermeldung, das die UriSource festgelegt sein muß.

09.07.2008 - 23:16 Uhr

Das Bild wird über WPF geladen


                                    <Image Name="_Image_Dokument" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="4" MaxHeight="100" MaxWidth="100" HorizontalAlignment="Center" MouseUp="_Image_Dokument_MouseUp">
                                        <Image.Source>
                                            <Binding Path="Dateiname" Converter="{StaticResource convertImagePath}" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
                                        </Image.Source>
                                        <Image.ToolTip>
                                                <Image MaxHeight="800" Height="Auto" MaxWidth="800" Width="Auto" DockPanel.Dock="Top">
                                                    <Image.Source>
                                                        <Binding Path="Dateiname" Converter="{StaticResource convertImagePath}" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
                                                    </Image.Source>
                                                </Image>
                                        </Image.ToolTip>
                                    </Image>


09.07.2008 - 19:59 Uhr

Ich ziehe per Drag & Drop Dateien vom Explorer in meine Application. Wenn sie das richtige Format haben (Images) werden diese in ein spezielles Verzeichnis kopiert (und umbenannt) und dann in eine Datenbank abgespeichert (nur der Dateiname).

Dieses wird dann durch einem Image auf der Page wiedergegeben. Die Source ist (über ein Converter, der den richtigen Pfad zurückgibt) damit verbunden.

Mein Problem ist nun, wenn ich wärend ein und der selben Session ein Image kopiere und einfüge, kann ich es nicht löschen.

Ich bekomme die Meldung, das ich bereits auf Image zu greife.



        void Dokumente_RowDeleting(object sender, DataRowChangeEventArgs e)
        {
            try
            {
               // _Image_Dokument.Source = null;
                _ExpanderDokumente.Visibility = Visibility.Collapsed;
                File.Delete(DokumentenManager.Properties.Settings.Default.Dokumentenpfad + "\\" + e.Row["Dateiname"].ToString());
            }
            catch (Exception ex)
            {
                MessageBox.Show("Beim löschen der Datei ist ein Fehler aufgetreten:" + Environment.NewLine + Environment.NewLine + ex.Message);
            }
        }


//Woanders
                    //Kopieren der Datei.
                    System.IO.File.Copy(from, to);

Hat jemand ne Idee woran es liegen kann? Ich bin so weit das es was mit der Anzeige des Bildes zu tun hat. Doch ein


            _Image_Dokument.Source = null;

liefert nicht den erhofften erfolg.

07.07.2008 - 16:25 Uhr

Du warst eben schneller. Diese Grundzüge kenne ich, aber da nichts raus kommt, gehe ich davon aus das es falsch ist.

  private void _Text_Click(object sender, RoutedEventArgs e)
        {
            _Image.Source = CaptureControl((Visual)_frame.Content);
        }

        private RenderTargetBitmap CaptureControl(Visual controlToRender)
        {
            RenderTargetBitmap bmp = new RenderTargetBitmap(100, 100, 200, 200, PixelFormats.Pbgra32);
            bmp.Render(controlToRender);
            return bmp;
        }

Selbstredent hat mein _frame bereits eine Seite angesteuert. und diese Seite soll halt in ein Bitmap verwandelt werden.

Nur leider scheint mein _Image scheinbar das zurückgelieferte bmp nicht zu verkraften.

07.07.2008 - 16:13 Uhr

Ich hab es jetzt so Probiert,

private RenderTargetBitmap CaptureScreen(FrameworkElement controlToRender)
{
RenderTargetBitmap bmp = new RenderTargetBitmap(controlToRender.Width, controlToRender.Height, 200, 200, PixelFormats.Rgb24);
bmp.Render((Visual)controlToRender);
return bmp;
}

Aber es wird nichts angezeigt. wo liegt der Fehler?

07.07.2008 - 16:02 Uhr

Der Renderer erwatet ein Visual objekt. Aber wie kann ich nun aus einen Control.Content ein Visual-Objekt machen? Beispielweise aus einen Frame oder einer RichTextBox?

07.07.2008 - 15:42 Uhr

Das habe ich schon häufiger gelesen. Aber irgendwie stehe ich bei dem Ding wie ein Ochs vorm Berg.

07.07.2008 - 14:28 Uhr

Eigendlich geht es darum, den Content bereich eines Controls zu kopieren. Muß ich da auch Drawing nehmen. Vor allem, wie stelle ich bei WPF Controls die obere Linke Spitze des Controls fest?

07.07.2008 - 12:17 Uhr

Hallo,

wie kann man mit WPF (also NICHT Windows Forms) ein Screenshot erstellen.

Ich finde im Netz nur Beispiele für WindowsForms (auf Basis der Klasse Bitmap).

06.07.2008 - 23:43 Uhr

Hallo,

ich würde gern von einem Frame eine Momentaufnahme, also die aktuell angezeigte Seite abspeichern. So das sie unabhängig von der Quelle gespeichert wird. (Um späteren Änderungen vorzubeugen).
Ob dies als HTML oder als Bild ist mir relativ Egal. Hauptsache man kann die Seite wieder darstellen, so wie sie in dem Moment war. Kopierschutz für Images & Co. liegt auf den seiten nicht vor, also brauch man darauf keine rücksicht nehmen.

Wie kann man das am besten machen?

Gruß Marco

02.07.2008 - 17:03 Uhr

Nein habe ich nicht. Wo finde ich das?

Ich konnte das Problem (für kurze Zeit beheben). Ich muß in der app.xaml die starturi neu angeben und abspeichern. Dann klappte es, bis ich das nächste mal das projekt veröffentlicht habe. Scheinbar passiert das seit dem immer wieder. Seltsamer weise steht genau DER String da. Ich ersetzte also nur identische strings.

02.07.2008 - 13:58 Uhr

Hallo,

ich hab schon ewigkeiten ein Projekt am laufen. Plötzlich erhalte ich das Meldungsfenster

Die Ressource "hauptfenster.xaml" kann nicht gefunden werden.

Die Datei physisch vorhanden und wird normal im Projektmappenexplorer angezigt. Ich kann nicht nachvollziehen, was es damit auf sich hat. Wäre schade um 1 Jahr arbeit, wenn das Projekt nu geschrottet wäre.

Das Fenster ist mein Startfenster. Ohne dieses funktioniert gar nichts.

02.07.2008 - 13:11 Uhr

Mit ist soeben ein Bug aufgefallen, der Tagelang keine Probleme machte. Wenn man IsEditable an hat, darf man ausschließlich nur den Text binden.
Das zusätzliche SelectedValuePath sorgt dafür, das bei einer manuellen Navigation der Wert erst genullt wird und dann geschrieben. Warum ist mir unklar, aber sobald die Bindung entfernt wurde, gab es keine Probleme mehr. 🤔

30.06.2008 - 01:06 Uhr

Hallo, ich wollte diverse Buttons verwenden, aber sie sollen nicht als Buttons erkennbar sein, also sich nicht optisch von dem Formularhintergrund abheben. (also kein eigener Border, kein eigener Hintergrund, kein 3D usw), nur wenn es das MouseHoover-Ereignis gibt, sollte erkennbar sein, das es sich um ein Button handelt.

Mir schwebt da die Optik von dem Windows-Vista-Kalender vor.

Wie kann ich das bewerkstelligen? (Ich habe von Styles Null Ahnung).

30.06.2008 - 01:02 Uhr

Ich habs so gelöst


<ComboBox SelectedValuePath="{Binding Path=Typ}" Grid.Column="1" Grid.Row="3" Text="{Binding Path=Typ}"   IsEditable="True">

und es funktioniert. Jedoch ist meine Combo Editable. D.h. es wird keine zahl oder ähnliches abgespeichert, sondern der Text. Was letztendlich heißt, das bei einer Textänderung der Standartitems dieses Item erhalten bleibt und mit geladen wird. Eine abhängige Variante ist mir damals auch nicht gelungen. Aber ich habe mich auch nicht lange damit beschäftigt, da es für meinen Fall unnötig und falsch gewesen wäre.

29.06.2008 - 02:56 Uhr

Hallo,

ich möchte gern meinen Nutzer die Möglichkeit geben, per Scanner Dokumente einzulesen und diese in die Datenbank des Programms ab zu legen.

Letzteres bekomme ich sicherlich ohne hilfe hin. Doch habe ich überhaupt keine Idee wie man einen Scanner anspricht. Weiß jemand Rat?

24.06.2008 - 18:59 Uhr

Das Problem lag daran, das sich das ListView erst aktulisiert, wenn man dem DataSet AcceptChanges sagt .

24.06.2008 - 17:39 Uhr

Du irrst dich. Im prinzip ist das recht simpel gelöst, die vorschau erfolgt über ein Mouseover ereignis. Dabei wird allerdings das fenster dann direkt ausgewählt und später wieder zurück gesetzt.

Effekte kann man sicherlich über Storybords o.ä. einbauen. Habe mich damit noch nicht beschäftigt.

Das X . siehe code

Muste nru den Code umbauen

Besseres Design. dafür ist nicht das Control zuständig, sondern das Template/Style. Das Controll stellt nur entsprechende Möglichkeiten zur Verfügung (z.b. beim Button das Click Ereignis), dann noch ein Standarttemplate dazu, damit überhaupt etwas angezeigt wird. In WPF ist (fast) alles optisch änderbar. Fast, weil ich bisher noch an keine Grenzen gestoßen bin, zumindet keine die mir WPF sondern eher meine Kenntnisse lieferten.

Ohne Gewähr


        <Style x:Key="TabControlStyle" TargetType="{x:Type TabControl}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabControl}">
                        <Grid ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition x:Name="ColumnDefinition0"/>
                                <ColumnDefinition x:Name="ColumnDefinition1" Width="0"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition x:Name="RowDefinition0" Height="Auto"/>
                                <RowDefinition x:Name="RowDefinition1" Height="*"/>
                            </Grid.RowDefinitions>
                            <Grid Grid.Column="0" Grid.Row="0" >
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>
                                <TabPanel Grid.Column="0"
                                    Margin="2,2,2,0" x:Name="HeaderPanel"
                                    IsItemsHost="true"
                                    Panel.ZIndex="1"
                                    KeyboardNavigation.TabIndex="1"
                                    />
                                <ComboBox Grid.Column="1" BorderBrush="Black" ItemsSource="{Binding ElementName=Content, Path=Items}" SelectionChanged="TabSelection_Change" Width="18">
                                    <ComboBox.ItemTemplate>
                                        <DataTemplate>
                                            <WrapPanel>
                                                <TextBlock Text="{Binding Path=Header}"/>
                                            </WrapPanel>
                                        </DataTemplate>
                                    </ComboBox.ItemTemplate>
                                </ComboBox>
                                <Button Content="X" Grid.Column="2" Click="btnCloseTab_Click" BorderBrush="Black" Width="18" Margin="0,0,2,0"/>
                            </Grid>
                            <Border x:Name="ContentPanel" Grid.Column="0" Grid.Row="1" BorderBrush="#D0CEBF" BorderThickness="0,0,1,1" KeyboardNavigation.DirectionalNavigation="Contained" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local">
                                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                                    <Border Background="{TemplateBinding Background}">
                                        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Margin="{TemplateBinding Padding}" x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
                                    </Border>
                                </Border>
                            </Border>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>


        <TabControl Name="Content" SelectedIndex="0" Style="{StaticResource TabControlStyle}" IsSynchronizedWithCurrentItem="True" TabStripPlacement="Top" Margin="0,0,0,10" />


24.06.2008 - 17:30 Uhr

Hab ich schon. Komme aber nicht weiter.

Nur 1. Welche bindingklasse welches elementes macht etwas falsch?
Wenn ich die Daten manuell auslese, sind sie auch im Dataset passend.

  1. Wie kann ich ein manuelles updaten auslösen. Beim Listview. würde mir schon reichen.
24.06.2008 - 15:43 Uhr

Die Lösung ist so einfach, das man immer wieder daran vorbei guckt. Einfach den Text zusätzlich binden, dann klappt es auch.


                    <ComboBox SelectedValuePath="{Binding Path=Ansprechpartner}" Text="{Binding Path=Ansprechpartner}"  Width="100" Margin="2,2" IsEditable="True">
                        <ComboBoxItem>Herr</ComboBoxItem>
                        <ComboBoxItem>Frau</ComboBoxItem>
                    </ComboBox>


24.06.2008 - 15:41 Uhr

Hallo,

ich habe ein Master-Slave Forumular, wobei die ListView als Slave funktioniert. So weit so gut, funktioniert auch (fast) alles. Wenn ich die Daten ändere, z.B. über eine Textbox, werden die Daten innerhalb des Listviews erst geändert, wenn die Liste komplett neu erstellt wird, (beispielweise bei einer Positionsänderung im Master Bereich). Irgendwie scheint die ListView keinen hinweis zu bekommen, das sie neu zeichnen muß.

Wo liegt der Fehler?


                            <ListView Name="lvTermin" Grid.ColumnSpan="3" SelectionChanged="lvTermin_SelectionChanged">
                                <ListView.ItemsSource>
                                    <Binding Path="Adressen2Kontakte" />
                                </ListView.ItemsSource>
                                <ListView.View> 
                                    <GridView  >
                                        <GridViewColumn DisplayMemberBinding="{Binding Path=ID}" Width="auto" Header="ID" />
                                        <GridViewColumn DisplayMemberBinding="{Binding Path=Icon}"	Width="auto"/>
                                        <GridViewColumn DisplayMemberBinding="{Binding Path=Kommunikationsmittel}"	Header="Kommunikationsmittel"/>
                                        <GridViewColumn DisplayMemberBinding="{Binding Path=Datum}"	Header="Datum"/>
                                        <GridViewColumn DisplayMemberBinding="{Binding Path=Typ}"	Header="Typ"/>
                                        <GridViewColumn DisplayMemberBinding="{Binding Path=Bemerkung}"	Header="Bemerkung"/>
                                    </GridView>
                                </ListView.View>
                            </ListView>


                            <Expander DockPanel.Dock="Bottom" DataContext="{Binding ElementName=lvTermin, Path=SelectedItem}" Name="myExpander" Visibility="Visible" IsExpanded="False"  Grid.Row="1" Grid.ColumnSpan="3">
                                    <TextBox Grid.Column="1" Text="{Binding Path=Icon}"></TextBox>
                                    <ComboBox SelectedValuePath="{Binding Path=Kommunikationsmittel}" Grid.Column="1" Grid.Row="1" Text="{Binding Path=Kommunikationsmittel}"  Margin="2,2" IsEditable="True">
                                        <ComboBoxItem>Schriftform</ComboBoxItem>
                                        <ComboBoxItem>E-Mail</ComboBoxItem>
                                        <ComboBoxItem>Telefonisch</ComboBoxItem>
                                        <ComboBoxItem>Fax</ComboBoxItem>
                                    </ComboBox>
                                    <TextBox Grid.Column="1" Text="{Binding Path=Datum}" Grid.Row="2"></TextBox>
                                    <TextBox Grid.Column="1" Text="{Binding Path=Typ}" Grid.Row="3" />
                                    <TextBox Grid.Column="1" Text="{Binding Path=Bemerkung}" Grid.Row="4"></TextBox>
                            </Expander>



23.06.2008 - 18:12 Uhr

Das DataContext funktionert. Alle anderen Elemente funktionieren einwandfrei. Aber die ComboBox mag nicht.

23.06.2008 - 16:18 Uhr

Hallo,

wie binde ich die Combobox richtig. Dieses führt leider nicht zum entsprechenden Erfolg.
Alles was ich möchte, ist, das in die Datenbindung der Entsprechnede Wert gespeichert wird. Funktioniert aber nicht.


 <ComboBox SelectedValue="{Binding Path=Ansprechparter}" SelectedValuePath="Ansprechpartner" Width="100" Margin="2,2"  >
                        <ComboBoxItem>Herr</ComboBoxItem>
                        <ComboBoxItem>Frau</ComboBoxItem>
                    </ComboBox>

23.06.2008 - 10:24 Uhr

Bin durch Zufall drauf gestoßen

        
     DataTable dt = new Datenbank.KontakteDataTable();

        public KontakteSeite()
        {
            InitializeComponent();
            BindingListCollectionView navigator = (BindingListCollectionView)CollectionViewSource.GetDefaultView(dt);

            DataContext = navigator;

            DataRow row = dt.NewRow();
            row["Firmenname"] = "1";
            dt.Rows.Add(row);

            navigator.MoveCurrentToFirst();            
            
        }

23.06.2008 - 10:17 Uhr

Leider funktioniert der Code so nicht. Und ich finde den Fehler nicht.

23.06.2008 - 09:42 Uhr

BindingSource ist im Namespace System.Windows.Forms und dieser ist bei WPF nicht verfügbar.

22.06.2008 - 23:55 Uhr

Hallo,

irgendwie habe ich im Moment ein Brett vor dem Kopf. Ich möchte eine Datenmenge, genauer eine Datentabelle aus einem DataSet mit diversen Elementen verbinden. So weit kein Problem, aber wie Navigiere ich jetzt in dieser Datenmenge manuell?
Bei anderen Fenstern habe ich immer ein ListView für die Navigation genutzt und dort bereits über WPF mit SelectedItem das Currentitem genutz, aber diese Möglichkeit entfällt, aufgrund der hohen Mengen an Kontakten. Also möchte ich gern die Typischen Vor, Zurück, Erster, Letzter -Buttons usw. verwenden.
Doch wie navigiere ich nun Manuell?

So binde ich zur Zeit:


        DataTable dt = new Datenbank.KontakteDataTable();
        public KontakteSeite()
        {
            InitializeComponent();
            DataContext = dt;
        }

25.05.2008 - 12:30 Uhr

Wie mache ich ein Cleaning?

24.05.2008 - 23:36 Uhr

Seit neuesten Compiliert C# Express die Dateien nicht mehr.

Ich schreibe Änderungen und drücke dann F5 (Standarteinstellung auf Debugging starten) und ich bekomme eine alte Version gestartet. Wenn ich Starten ohen Debugging wähle, dann erscheinen auch meine Änderungen. Wo liegt das Problem?

17.05.2008 - 16:43 Uhr

Mit einer Express version kann man eine Setupprojekte erstellen. ABER es geht, habs soeben raus gefunden. Die Datei muß als Inhalt / Content deklariert werden (Buildvorgang). Dann kann man sie unter Anwendungsdateien auswählen. Hier muß man Einschließen wählen... 😁

17.05.2008 - 11:58 Uhr

Hallo Freunde,

ich habe ein Projekt entwickelt und nun Testweise diese Freunden fürs Debugging zur Verfügung stellen. Doch habe ich nun ein paar Probleme mit der ClickOnce Veröffentlichung.

Das Programm funktioniert einwandfrei durch die Veröffentlichung. Ich nutzte diverse XML-Files als "Datenbank", diese werden jedoch nicht mit ausgeliefert. Natürlich funktionieren direkte URL "C:\Projekte\meinProjekt" weiterhin, doch das ist ja nicht das, was ich Ursprünglich wollte. (da ich in dieser Phase noch nur mit direkten URL´s arbeite, ist dies nur durch einen zufall aufgetaucht). Aber ein "\Data\meineTools.xml" funktioniert nicht.
Wie kann ich nun ClickOnce überreden genau diese Dateien mit zu übertragen und entsprechende Verzeichnisse an zu legen.

15.05.2008 - 12:37 Uhr

Ich bin jetzt so weit, das ich das machen kann, was ich will. Jedoch weiß ich nicht, wie ich nun Datenquellen ausschließen kann. Wo liegt mein Fehler? Eigendlich soll ja nur ListView1 liefern dürfen. Aber im Moment akzeptiert ListView2 von allem (selbst von Desktopverknüpfungen) und packt dann das seletierte Item aus ListView1 hinzu.


        int oldIndex = -1;

        public Ruestungsrechner()
        {
            InitializeComponent();
            DataContext = Datenbank.Ruestungen;

            // Drag n Drop
            ListView1.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(ListView1_PreviewMouseLeftButtonDown);
            ListView2.Drop += new DragEventHandler(ListView2_Drop);

        }

        // function called during drop operation
        void ListView2_Drop(object sender, DragEventArgs e)
        {
            DataRowView movedItem = ListView1.Items[oldIndex] as DataRowView;

            MessageBox.Show(e.Source.ToString());
            ListView2.Items.Add(movedItem);
        }

        void ListView1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            // Erstellen der Programmlogic zum ermitteln des angeklickten Items
            oldIndex = this.GetCurrentIndex(e.GetPosition);
            
            if (oldIndex < 0)
                return;

            ListView1.SelectedIndex = oldIndex;

            DataRowView selectedItem = this.ListView1.Items[oldIndex] as DataRowView;

            if (selectedItem == null) return;

            // this will create the drag "rectangle"
            DragDropEffects allowedEffects = DragDropEffects.Move;
            
            if (DragDrop.DoDragDrop(this.ListView2, selectedItem, allowedEffects) != DragDropEffects.None)
            {

            }
        }

        /// <summary>
        /// Gibt ein ListViewItem zurück, gemäß Anweisung.
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        ListViewItem GetListViewItem(int index)
        {
            if (ListView1.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
                return null;

            return ListView1.ItemContainerGenerator.ContainerFromIndex(index) as ListViewItem;
        }

        /// <summary>
        /// Gibt den Index des Items in der ListView zurück
        /// </summary>
        /// <param name="getPosition"></param>
        /// <returns>Itemposition</returns>
        int GetCurrentIndex(GetPositionDelegate getPosition)
        {
            int index = -1;
            for (int i = 0; i < this.ListView1.Items.Count; ++i)
            {
                ListViewItem item = GetListViewItem(i);
                if (this.IsMouseOverTarget(item, getPosition))
                {
                    index = i;
                    break;
                }
            }
            return index;
        }

        /// <summary>
        /// Gibt ein bool-Wert zurück, ob ein Punkt innerhalb eines bereiches des Targetbereiches ist
        /// </summary>
        /// <param name="target"></param>
        /// <param name="getPosition"></param>
        /// <returns></returns>
        bool IsMouseOverTarget(Visual target, GetPositionDelegate getPosition)
        {
            Rect bounds = VisualTreeHelper.GetDescendantBounds(target);
            Point mousePos = getPosition((IInputElement)target);
            return bounds.Contains(mousePos);
        }


14.05.2008 - 21:26 Uhr

Sorry. Ich glaub das ist für mich ein wenig zu hoch. Auch wenn ich das Lese und Versuch das Beispiel nach zu bilden, komme ich schon nicht weiter. Irgendwie hab ich das gefühl das selbst die simpelsten Beispiele in WPF mit irgendeinene sch... überladen sind.

Wie leite ich das DND überhaupt ein?
Welche Schritte muß ich gehen?

14.05.2008 - 20:35 Uhr

Auch nachdem ich Stunden im Netz damit verbracht habe, etwas über Drag and Drop im WPF/C# raus zu finden, kam ich immer nur auf Kryptische Beispiele von irgend welchen Datenvergleichen.

Alles was ich will, ist ein Item von Listbox1 auf listbox2 zu ziehen. Wie kann ich das machen. Ich habe von Drag n Drop bisher keine Ahnung.

14.05.2008 - 20:31 Uhr

Problem gelöst. Mann muß dann jeden Spalte ein Celltemplate mit geben. So ein beispiel


        <ListView ItemsSource="{Binding}" >
            <ListView.View>
                <GridView AllowsColumnReorder="True">
                    <GridViewColumn Header="Rüstung">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Name}" TextAlignment="Left"  />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Kopf">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Kopf}" TextAlignment="Center"  />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>

13.05.2008 - 20:36 Uhr

Hallo,

ich nutze Listview als Gridview. Ich definiere die Spalten usw. Doch nun steh ich vor einem Problem. Alle Zellen sollen Zentriert angezeigt werden.

Dies setze ich über


        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>


Doch möchte ich nun die Erste die Zellen in der Ersten Spalte Linksbündig haben. Wie kann ich das anstellen?