Laden...

Forenbeiträge von theSoulT Ingesamt 64 Beiträge

24.10.2023 - 07:39 Uhr

Sorry für die späte Antwort. Ich bin grad am grübeln, ob ich das Thema irgendwie ohne dieses Treeview lösen kann. Bin damit nicht wirklich zufrieden 😦 Das scheint sehr komplex zu sein...

13.10.2023 - 15:10 Uhr

Zitat von Th69

Was soll denn der ausgewählte Datensatz bei der ComboBox genau sein (außer dem gewählten CodeArea-Objekt)?

Letzendlich soll der DamageCode ausgewählt sein. Den brauch ich dann zur weiteren Verarbeitung.

13.10.2023 - 09:25 Uhr

Du kannst zwar im TreeView einzelne Items (Zeilen) markieren, für die Anzeige in der ComboBox wird aber als SelectedItem immer nur ein Element der zugewiesenen ItemsSource ausgewählt (bei dir also ein CodeArea- Objekt).

Stimmt, daran hab ich gar nicht gedacht. Das SelectedItem ist ja nur das von der Combobox und nicht vom TreeView. Und da ist es die CodeArea.

Du müßtest ansonsten noch eine weitere Eigenschaft SelectedEntry(o.ä). erstellen und diese dann per Binding an das TreeView.SelectedItem aktualisieren lassen.

Geht das denn überhaupt? Ich hab ja letzendlich für jedes Item der Combobox ein eigenes TreeView. Ich versuch mal mein Glück.

Aber was soll in der ComboBox angezeigt werden, wenn eine der übergeordneten Elemente (wie z.B. "QSVS Zuordnung" oder "Umwelteinflüsse") markiert wird?

Das wäre die nächste Frage. Die sollen eigentlich nicht gewählt werden können 😃

Hinweis: Deine Modelle sind wohl Datenbank Entitäten, weil sie ICollection verwenden, so wäre die korrekte Initialisierung ein HashSet und keine List.
Relationen zwischen Entitäten können nur ein mal existieren, weshalb EFCore unter der Haube auch HashSet verwendet. HashSet ist für solche Use Cases konzipiert und optimiert; List macht kein Sinn.

PS: wenn es Entitäten sind, dann solltest das vielleicht auch so benennen 😃

Hab es an meinen Kollegen weitergegebn 😃 Danke

13.10.2023 - 09:14 Uhr

Hab das ControlTemplate separiert, danke 😃

12.10.2023 - 11:56 Uhr

Das ist die Voreinstellung wenn weder DisplayMemberPath gesetzt ist noch die ToString-Methode überschrieben wurde

Aber wenn man das ItemTemplate setzt mit einem Textblock zb. und dann die Text Eigenschaft bindet, wird doch dieses Binding übernommen für den angezeigten Wert? 

es werden ja nur die Daten im Model neu zugewiesen, der Code bleibt ja derselbe)

Das muss ich mal probieren. Ich war der Meinung die komplette Model-Klasse wird erneuert

Das versteh ich nicht, denn dieser TextBlock ist doch in jedem TreeView-Item enthalten, d.h. du hast eine (hierarchische) Liste davon. Willst du dann alle anzeigen oder nur den ersten Eintrag davon?

Ich meine das selektierte Element soll in der Struktur angezeigt werden: Id - CodeDescription

ComboBox mit TreeView-Elementen? Das habe ich bisher noch nicht gesehen

War für meinen Fall ganz praktisch. Ich nehme aber gerne auch andere Ideen auf. Im Anhang mal ein Bild wie es aussieht 😃 In diesem Fall sollte in der Combobox oben "1001 - Umwelteinflüsse" stehen.

PS: Hattest du meine letzte Antwort aus deinem Beitrag ListView zeigt nur Objektnamen an, Problem mit ContentPresenter und DataTemplates noch gelesen? Oder hast du inzwischen eine andere Lösung (außer der Codeduplikation) gefunden?

Ne hatte ich noch nicht gesehen. Hab es bisher bis Codeduplikation gelöst. Muss ich mir dann nochmal anschauen 😃 Danke dir für dne Hinweis.

12.10.2023 - 07:39 Uhr

Hallo zusammen,

wiedermal ein kleines Problem:

Ich hab mir eine Combobox gebaut mit einem TreeView drin. In der TreeView hab ich einige Bindings an den Textblöcken.  Die Combobox weiß nun vermutlich nicht, welches Binding als SelectedItem angezeigt werden soll und zeigt mir nur den Klassennamen an. Hier meine Combobox:

<ComboBox HorizontalContentAlignment="Stretch" ItemsSource="{Binding GlobalInstance.DropdownDamageArea}" SelectedValuePath="Name" ItemContainerStyle="{StaticResource treeCombobox}" ScrollViewer.CanContentScroll="False">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Name}"/>
                <TreeView x:Name="tree" Margin="5" ItemsSource="{Binding CodeGroups}" Style="{StaticResource comboTreeView}">
                    <TreeView.Template>
                        <ControlTemplate>
                            <ItemsPresenter/>
                        </ControlTemplate>
                    </TreeView.Template>
                    <TreeView.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding DamageCodes}">
                            <TextBlock Text="{Binding Name}"/>
                            <HierarchicalDataTemplate.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock x:Name="text">
                                        <Run Text="{Binding Id}"/>
                                        <Run Text=" - "/>
                                        <Run Text="{Binding CodeDescription}"/>
                                    </TextBlock>
                                </DataTemplate>
                            </HierarchicalDataTemplate.ItemTemplate>
                        </HierarchicalDataTemplate>
                    </TreeView.ItemTemplate>
                </TreeView>
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Dazu gehört folgender Code:

private ObservableCollection<CodeArea> dropdownDamageArea;
public ObservableCollection<CodeArea> DropdownDamageArea
{
	get
	{
		return dropdownDamageArea;
	}
	set { dropdownDamageArea = value; OnPropertyChanged(); }
}
public partial class CodeArea
{
    [Key]
    public int Id { get; set; }

    [StringLength(50)]
    public string? Name { get; set; }

    [InverseProperty("GroupArea")]
    public virtual ICollection<CodeGroup> CodeGroups { get; set; } = new List<CodeGroup>();
}
public partial class CodeGroup
{
    [Key]
    public int Id { get; set; }

    [StringLength(50)]
    public string? Name { get; set; }

    public int? GroupAreaId { get; set; }

    [InverseProperty("CodeGroup")]
    public virtual ICollection<DamageCode> DamageCodes { get; set; } = new List<DamageCode>();

    [ForeignKey("GroupAreaId")]
    [InverseProperty("CodeGroups")]
    public virtual CodeArea? GroupArea { get; set; }
}
public partial class DamageCode
{
    [Key]
    [StringLength(4)]
    [Unicode(false)]
    public string Id { get; set; } = null!;

    public int CodeGroupId { get; set; }

    [StringLength(50)]
    public string? CodeDescription { get; set; }

    [ForeignKey("CodeGroupId")]
    [InverseProperty("DamageCodes")]
    public virtual CodeGroup CodeGroup { get; set; } = null!;

    [InverseProperty("DamageCode")]
    public virtual ICollection<WorkActionsHardware> WorkActionsHardwareDamageCodes { get; set; } = new List<WorkActionsHardware>();

    [InverseProperty("ProcessCode")]
    public virtual ICollection<WorkActionsHardware> WorkActionsHardwareProcessCodes { get; set; } = new List<WorkActionsHardware>();
}

Ich würde gerne diesen Textblock als SelectedItem in der Combobox anzeigen:

<TextBlock x:Name="text">
	<Run Text="{Binding Id}"/>
	<Run Text=" - "/>
	<Run Text="{Binding CodeDescription}"/>
</TextBlock>

Es wird mir aber nur folgendes angezeigt (Siehe Anhang)

Zur Info: Wir arbeiten mit dem EntityFramework.

DisplayMemberPathgeht ja leider nicht, da das ItemTemplate gesetzt wird in der Combobox. Und die ToString()- Methode überschreiben geht glaub ich auch nicht. Dies müsste ja im Model gemacht werden. Aber bei DB Änderungen wird ja jedesmal vom EF das Model überschrieben. Deshalb ist das glaub ich auch keine Lösung.

Ich hoffe Ihr habt noch Ideen

11.09.2023 - 11:21 Uhr

Ja aber der Code steht in einer anderen Datei. Und ja die Foreground Eigenschaft muss geändert werden.

Ich versuch es jetzt mal mit einem UserControl. Damit sollte es dann eigentlich klappen.

08.09.2023 - 19:01 Uhr

Aber ich hab das ControlTemplate in einer extra Style Datei. Die kennt das PackIcon direkt ja gar nicht. Dafür ist ja der ContentPresenter dachte ich..

08.09.2023 - 15:05 Uhr

Hey zusammen,

hab mal wieder eine kleine Frage, die Ihr sicher schnell beantworten könnt.

Ich habe einen Style für einen ToggleButton angelegt. Darin ist ein ControlTemplate mit ControlTemplate.Triggers.

Nun möchte ich einen ToggleButton erstellen, welcher ein Icon enthält. Ich nutze für Icons die mahApp Icons.

                        <ToggleButton x:Name="tglButton" HorizontalAlignment="Right" Background="Transparent" Width="35">
                            <iconPacks:PackIconMaterial Kind="Glasses" Foreground="{StaticResource yellow}" Width="20"/>
                        </ToggleButton>

Dieses Icon hat standardmäßig eine gelbe Farbe.

Nun möchte ich in meinem ControlTemplate.Triggers die Farbe abhängig vom CheckState ändern.

Leider funktioniert der Trick mit TextBlock.Foreground oder auch Control.Foreground nur bei dem Content des ToggleButton selber. Aber nicht bei meinem Icon, welches innerhalb des ToggleButton liegt.

Mein ControlTemplate sieht wie folgend aus:

                <ControlTemplate TargetType="{x:Type ToggleButton}">
                    <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true" CornerRadius="{Binding Source={StaticResource controlCorners}}">
                        <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
                            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
                        </Trigger>
                        <Trigger Property="IsPressed" Value="true">
                            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
                            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
                            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
                            <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
                        </Trigger>
                        <Trigger Property="IsChecked" Value="true">
                            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Checked.Background}"/>
                            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Checked.Border}"/>
                            <Setter Property="TextBlock.Foreground" TargetName="contentPresenter" Value="{StaticResource black}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>

Könnt Ihr mir hier weiterhelfen?

Liebe Grüße und danke schonmal 😃

29.08.2023 - 07:31 Uhr

Danke euch.

Ich hab jetzt zwei identische Styles angelegt. Der eine mit x:Key="GridViewRow"welcher dann den GridViewRowPresenterenthält. Und der Default-Style enthält dann den ContentPresenter

Schade, aber immerhion gibt es einen Workaround 😄

Ist nur etwas blöd, das ich jetzt an zwei Stellen den Style ändern muss 😦

28.08.2023 - 07:23 Uhr

Tausche den ContentPresenter gegen einen GridViewRowPresenter!

Das hab ich oben bereits ausgeschlossen, da sich der Style dann nicht mehr auf die normalen ListViews einsetzen lässt und dort dann Probleme macht.

Ich meine ja nur zum Austesten, also direkt in das ListView reinkopieren:

<ListView.ItemContainerStyle>
   <Style TargetType="ListViewItem">
     <!-- ... -->
   </Style>
</ListView.ItemContainerStyle>

Das klappt. Aber wie bringe ich das am besten in meinem Style unter? Ich nehme an das klappt, weil damit mein erstellter Default Style dadurch nicht mehr genutzt wird. Sobald ich nämlich BasedOn="{StaticResource {x:Type ListViewItem}}" noch in deinen Code einfüge, geht es wieder nicht.

25.08.2023 - 11:41 Uhr

Wie mach ich das am besten? Mein Style ist ja in einem RessourceDictionary. Dort kann ich <ListView.ItemContainerStyle>nicht setzen, da er nciht weiß auf welches ListView er zugreifen soll.

25.08.2023 - 06:54 Uhr

Evtl. mußt du noch Content und ContentTemplate bei dem ContentPresenter übernehmen (d.h. daran binden), s.a. die Antwort in Wpf – ListViewItem custom template: ContentPresenter stays empty.

Das hab ich auch schon versucht. hat leider auch nichts gebracht.

Ansonsten hilft evtl. WPF ItemsControl – Advanced.

Weiß nicht genau, was hier für mich zutrifft 😦

24.08.2023 - 13:44 Uhr

Das stimmt, da hat sich noch ein kleiner Fehler eingeschlichen, danke! Aber das ändert leider nichts an meinem Problem.

24.08.2023 - 11:52 Uhr

Hey zusammen,

in meinem Projekt habe ich einen Style angelegt für alle ListBoxItems (Damit alle die selben Farben haben und die selben Triggers,etc.). Nun möchte ich gern eine neue ListView anlegen als GridView und mit DataTemplates (Mein Problem ist auch bei DisplayMemberBinding vorhanden). Leider werden mir meine Einträge nicht im ListView angezeigt, sondern nur der Objektname. Dies liegt an dem ContentPresenter im Style. Gelöst wäre es eigentlich wenn ich den ersetze durch einen GridViewRowPresenter, allerdings funktioniert dann der Style nicht mehr an den anderen ListViews. Wie kann ich das Problem am besten lösen? Danke schon nmal für eure Hilfe und hier noch der relevante Code dazu:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <SolidColorBrush x:Key="Item.Static.Border" Color="Transparent"/>
    <SolidColorBrush x:Key="Item.MouseOver.Background" Color="{Binding Source={StaticResource darkgray}, Path=Color}"/>
    <SolidColorBrush x:Key="Item.MouseOver.Border" Color="{Binding Source={StaticResource yellow}, Path=Color}"/>
    <SolidColorBrush x:Key="Item.SelectedActive.Background" Color="{Binding Source={StaticResource gray}, Path=Color}"/>
    <SolidColorBrush x:Key="Item.SelectedActive.Border" Color="{Binding Source={StaticResource yellow}, Path=Color}"/>
    <SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="{Binding Source={StaticResource gray}, Path=Color}"/>
    <SolidColorBrush x:Key="Item.SelectedInactive.Border" Color="{Binding Source={StaticResource white}, Path=Color}"/>

    <Style TargetType="ListViewItem">
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="BorderBrush" Value="{StaticResource Item.Static.Border}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                    <Border x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsMouseOver" Value="True"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.MouseOver.Background}"/>
                            <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.MouseOver.Border}"/>
                            <Setter Property="BorderThickness" TargetName="Bd" Value="1"/>
                        </MultiTrigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="Selector.IsSelectionActive" Value="False"/>
                                <Condition Property="IsSelected" Value="True"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Background}"/>
                            <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Border}"/>
                            <Setter Property="BorderThickness" TargetName="Bd" Value="1"/>
                        </MultiTrigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="Selector.IsSelectionActive" Value="True"/>
                                <Condition Property="IsSelected" Value="True"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Background}"/>
                            <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Border}"/>
                            <Setter Property="BorderThickness" TargetName="Bd" Value="1"/>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
 <ListView Grid.Row="1" Grid.ColumnSpan="2" Height="200" Background="Transparent" Margin="0 10 0 0" FontSize="20" VerticalAlignment="Top" ItemsSource="{Binding ActionList}">
     <ListView.View>
         <GridView>
             <GridViewColumn Header="Test" DisplayMemberBinding="{Binding Name}"/>
             <GridViewColumn Header="Eintrag" Width="80">
                 <GridViewColumn.CellTemplate>
                     <DataTemplate>
                         <TextBlock Text="{Binding Entry}"/>
                     </DataTemplate>
                 </GridViewColumn.CellTemplate>
             </GridViewColumn>
             <GridViewColumn Header="Bezeichnung" Width="150">
                 <GridViewColumn.CellTemplate>
                     <DataTemplate>
                         <TextBlock Text="{Binding Name}"/>
                     </DataTemplate>
                 </GridViewColumn.CellTemplate>
             </GridViewColumn>
             <GridViewColumn Header="Schadenscode" Width="150">
                 <GridViewColumn.CellTemplate>
                     <DataTemplate>
                         <TextBlock Text="{Binding FailureCode}"/>
                     </DataTemplate>
                 </GridViewColumn.CellTemplate>
             </GridViewColumn>
             <GridViewColumn Header="Aktionscode" Width="150">
                 <GridViewColumn.CellTemplate>
                     <DataTemplate>
                         <TextBlock Text="{Binding ActionCode}"/>
                     </DataTemplate>
                 </GridViewColumn.CellTemplate>
             </GridViewColumn>
         </GridView>
     </ListView.View>
 </ListView>
07.07.2023 - 13:46 Uhr

Ah stimmt, da das zwei Objekte sind, sind es auch getrennte Variablen kann man sagen, richtig? Wie kann man das am besten lösen?

07.07.2023 - 13:10 Uhr

Hallo ihr lieben,

ich hätte da eine Frage. Ich hoffe ihr könnt mir da weiterhelfen.

Ich möchte zwischen zwei Views wechseln. Diese sind in ContentControls eingebettet über

<ContentControl Content="{Binding SelectedViewModel}" />

SelectedViewModel ist deklariert in meiner BaseViewModel:

        private BaseViewModel selectedViewModel;

        public BaseViewModel SelectedViewModel
        {
            get { return selectedViewModel; }
            set 
            { 
                selectedViewModel = value;
                OnPropertyChanged();
            }
        }

Durch einen Button, welcher in einer der Views ist, möchte ich die View selbst ändern. Leider passiert gar nichts 😦

Der ChangeCommand sieht so aus:

    public class ChangeCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;
        public LoginVM ViewModel;
        public ChangeCommand(LoginVM vm)
        {
            ViewModel = vm;
        }
        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            ViewModel.LogIn();
        }
    }

Damit wird dann LogIn() ausgeführt, bei welchem die SelectedViewModel geändert wird auf die andere View.

        public void LogIn()
        {
            SelectedViewModel = new OtherVM();
        }

Wenn ich Debugge, wird die Variable auch gesetzt korrekt, aber das Binding funktioniert anscheinend nicht korrekt. Oder warum wird die View nicht geändert?

Im Anhang ist das komplette Projekt.

06.07.2023 - 06:37 Uhr

Doch, das war die Lösung. Ich danke euch 😀 Bin halt leider noch Anfänger und in den Onlinekursen lernt man nur Grundlagen. 😅

Vielen Dank!

05.07.2023 - 21:38 Uhr

Ja das glaub ich dir gern. Allerdings funktioniert es nicht. Hab das Projekt mal in einfach nachgebaut. Könntest du dir das bitte mal anschauen? Wenn man das so startet ist der ToggleButton oben schon ausgeblendet. Hab das OnPropertyChanged nicht ausgeführt. Funktioniert aber trotzdem nicht.

05.07.2023 - 20:56 Uhr

Der Unterschied bei deinem Projekt ist, dass der ToggleButton und der LoginButton in einer View sind. Bei mir sind das zwei Views. Mein ToggleButton sitzt in einer anderen View wie der Login Button.

05.07.2023 - 14:55 Uhr

Hatte das bei einem online Kurs so gelernt. Wenn der DataContext auf einer andern VM ist, als im übergeordneten Control, dann kann man so einen anderen DataContext nutzen.

05.07.2023 - 13:44 Uhr

Danke für deine Rückmeldung 😃

Ich hab es auhc schon mit einem Converter versucht tatsächlich. Selbes Ergebnis. Dauerhaft wird der Button angezeigt.

Wenn ich den Mode ändere, wird der Button nie angezeigt 😅 Beides nicht so optimal.

Kann das Problem eventuell an der Implementierung des ToggleButton zu tun haben?

            <ToggleButton  
            HorizontalAlignment="Left"  
            Width="50"  
            Visibility="{Binding Source={StaticResource LoginVM}, 
            Path=IsAuthenticated, 
            Converter={StaticResource BooleanToVisibilityConverter}}" 
            Command="{Binding OpenMainMenuCommand}">
                <ToggleButton.Template>
                    <ControlTemplate TargetType="ToggleButton">
                        <Border 
                        x:Name="border" 
                        Background="{DynamicResource darkgray}" 
                        CornerRadius="5" 
                        Margin="5">
                            <iconPacks:PackIconMaterial 
                            x:Name="icon" 
                            Kind="Menu" 
                            HorizontalAlignment="Center" 
                            VerticalAlignment="Center" 
                            Foreground="{DynamicResource yellow}"/>
                        </Border>
                    </ControlTemplate>
                </ToggleButton.Template>
                <ToggleButton.Triggers>
                    <EventTrigger 
                    RoutedEvent="ToggleButton.Unchecked">
                        <BeginStoryboard>
                            <Storyboard 
                            x:Name="HideStackPanel">
                                <DoubleAnimation 
                                Storyboard.TargetName="navPanel" 
                                Storyboard.TargetProperty="Width" 
                                BeginTime="0:0:0" 
                                From="200" 
                                To="0" 
                                Duration="0:0:0:0.3"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <EventTrigger 
                    RoutedEvent="ToggleButton.Checked">
                        <BeginStoryboard>
                            <Storyboard 
                            x:Name="ShowStackPanel">
                                <DoubleAnimation 
                                Storyboard.TargetName="navPanel" 
                                Storyboard.TargetProperty="Width" 
                                BeginTime="0:0:0" 
                                From="0" 
                                To="200" 
                                Duration="0:0:0:0.3"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </ToggleButton.Triggers>
            </ToggleButton>
05.07.2023 - 11:18 Uhr

Falsches Forum, sorry. Bitte verschieben in WPF und XAML

05.07.2023 - 11:11 Uhr

Hallo zusammen,

ich bin grad in der Erstellung eines Tools. Dieses hat mehrer ViewModels passend zu den Views.

In dem View "BasicWindowView" habe ich einen ToggleButton, welcher anfangs nicht sichtbar sein soll. Erst wenn der User auf den Login Button in der LoginView klickt, soll der ToggleButton sichtbar werden. Dazu habe ich eine Visibility-Variable "MenuVisibility" in der BaseViewModel angelegt, damit diese in allen ViewModels verfügbar ist. Gebindet habe ich den ToggleButton dann aber auf die LoginVM.MenuVisibility Eigenschaft.

Kann man das so machen?

Die MenuVisibility wird im Konstruktor von LoginVM direkt auf Collapsed gesetzt.

Nun habe ich per Command eine Methode in der LoginVM aufgerufen, welche die MenuVisibility auf Visible setzt. Leider ist der Button dauerhaft sichtbar, beim Debuggen wird die Variable aus mir unerklärlichen Gründen immer wieder auf Visible gesetzt.

	public class LoginVM : BaseViewModel, INotifyPropertyChanged
	{ 
        public LoginVM()
        {
            LoginCommand = new LoginCommand(this);
            ActualUser = new User();
            Username = "m.mustermann";
            MenuVisibility = Visibility.Collapsed;
        }

        public void LoggingIn()
        {
            MenuVisibility = Visibility.Visible;
        }
        
        ...
	}
    public abstract class BaseViewModel : INotifyPropertyChanged
    {
        private Visibility menuVisibility;
        public Visibility MenuVisibility
        {
            get { return menuVisibility; }
            set 
            { 
                menuVisibility = value;
                OnPropertyChanged();
            }
        }
        
        ...
    }
<ToggleButton HorizontalAlignment="Left" Width="50" Visibility="{Binding Source={StaticResource LoginVM}, Path=MenuVisibility, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" Command="{Binding OpenMainMenuCommand}">
...

Könnt ihr mir da einen Tipp geben, was das Problem ist, bzw wie ich das eleganter lösen kann?

Danke schonmal 😃

31.01.2022 - 12:22 Uhr

Vielen Dank schonmal für eure Mühen. Leider hab ich mir das alles selber beigebracht und versteh das noch nicht so ganz, was Ihr versucht zu erklären 🙁
Könntet ihr das bitte anhand eines Beispiels erklären? Das ist dann für mich verständlicher 😁

25.01.2022 - 11:49 Uhr

Servus FZelle,

ich bin da noch ziemlich am Anfang und hab das halt so gelernt 🙂
Ich werde es mir mal anschauen.
Aber das hat ja nichts mit meinem eigentlichen Problem zu tun oder?

Lg

24.01.2022 - 11:15 Uhr

Servus Palladin007 und alle anderen 🙂,

bin jetzt etwas weiter und hab meine Variable verschoben.
Aktueller Stand:

StartView.xaml


<StackPanel Orientation="Vertical" Grid.ColumnSpan="2" DataContext="{Binding Source={StaticResource Locator}, Path=DataVM}">
                        <StackPanel.Resources>
                            <Style BasedOn="{StaticResource {x:Type Button}}" TargetType="Button">
                                <Setter Property="Background" Value="{DynamicResource clrPrimary}"/>
                                <Setter Property="Margin" Value="0 0 0 10"/>
                                <Setter Property="FontSize" Value="20"/>
                                <Setter Property="Height" Value="Auto"/>
                                <Setter Property="IsEnabled" Value="False"/>
                                <Setter Property="ToolTip" Value="Adapter oder Gerät ist nicht bereit!"/>
                                <Setter Property="ToolTipService.IsEnabled" Value="True"/>
                                <Setter Property="ToolTipService.ShowOnDisabled" Value="True"/>
                                <Style.Triggers>
                                    <MultiDataTrigger>
                                        <MultiDataTrigger.Conditions>
                                            <Condition Binding="{Binding DataContext.UnitsModel.Instance.AdaptIsReady, RelativeSource={RelativeSource AncestorType=StackPanel}}" Value="True"/>
                                            <Condition Binding="{Binding DataContext.UnitsModel.Instance.UnitIsReady, RelativeSource={RelativeSource AncestorType=StackPanel}}" Value="True"/>
                                        </MultiDataTrigger.Conditions>
                                        <MultiDataTrigger.Setters>
                                            <Setter Property="IsEnabled" Value="True"/>
                                            <Setter Property="ToolTipService.IsEnabled" Value="False"/>
                                        </MultiDataTrigger.Setters>
                                    </MultiDataTrigger>
                                </Style.Triggers>
                            </Style>
                        </StackPanel.Resources>
                        <Button Content="FUT starten" DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}" Command="{Binding UpdateViewCommand}" CommandParameter="startFUT"/>
                        <Button Content="Manuell testen" DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}" Command="{Binding UpdateViewCommand}" CommandParameter="manuellTesting"/>
                        <Button Content="PVIS Befehle ausführen" DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}" Command="{Binding UpdateViewCommand}" CommandParameter="pvisAction"/>
                    </StackPanel>

DataViewModel.cs (DataVM):


        private UnitsModel untisModel = UnitsModel.Instance;
        public UnitsModel UntisModel
        {
            get { return untisModel; }
            set
            {
                if (untisModel != value)
                {
                    untisModel = value;
                    RaisePropertyChanged();
                }
            }
        }

UnitsModel.cs:


        private static UnitsModel instance = null;
        private static readonly object singletonLock = new object();
        public static UnitsModel Instance
        {
            get
            {
                lock (singletonLock)
                {
                    if (instance == null)
                    {
                        instance = new UnitsModel();
                    }
                    return instance;
                }
            }
        }

        private bool adaptIsReady;
        public bool AdaptIsReady
        {
            get { return adaptIsReady; }
            set
            {
                if (adaptIsReady != value)
                {
                    adaptIsReady = value;
                    OnPropertyChanged();
                }
            }
        }

        private bool unitIsReady;
        public bool UnitIsReady
        {
            get { return unitIsReady; }
            set
            {
                if (unitIsReady != value)
                {
                    unitIsReady = value;
                    OnPropertyChanged();
                }
            }
        }

Leider funktioniert mein Binding mit dem Singleton so nicht, wie ich mir das vorstelle. Hat hier noch jemand einen Tipp?

Lg TheSoulT

11.01.2022 - 13:50 Uhr

{Binding DataContext.MyProperty, RelativeSource={RelativeSource AncestorType=StackPanel}}

Normalerweise ist das nicht notwendig, das macht man nur, wenn man aus irgendeinem Grund einen anderen DataContext hat, das aber nicht ändern kann.

Das war aber jetzt genau das, was ich gebraucht habe 🙂
Mein DataContext für den Button hab ihc ja auf MainVM gelegt, da dort die UpdateViewcommand liegt.
Aber die Variable für meine Prüfung liegt in einer anderen VM.

Vielen Dank dir. Jetzt läuft es so, wie ich mir das vorstelle... 👍

11.01.2022 - 09:48 Uhr

Danke dir, das war schon der Hinweis, der mir gefehlt hat. Die Variablen liegen in einer anderen VM.
Ich vermute, es gibt keine Möglichkeit, für die Commands einen anderen DataContext zu setzen, als für meine Variablen, oder?

11.01.2022 - 08:36 Uhr

Hallo zusammen,

ich komm leider bei meinem Programm nicht weiter.
Ich möchte drei Buttons in Abhängigkeit von zwei Variablen in meinem ViewModel auf IsEnabled = True setzen bzw false.
Dazu habe ich mit den MultiDataTriggern versucht auf die Variablen zu binden. Aber leider klappt das nicht so wie ich mir das vorstelle.
Habt ihr noch eine Idee?


                    <StackPanel Orientation="Vertical" Margin="200 10" Grid.ColumnSpan="2">
                        <StackPanel.Resources>
                            <Style BasedOn="{StaticResource {x:Type Button}}" TargetType="Button">
                                <Setter Property="Background" Value="{DynamicResource clrPrimary}"/>
                                <Setter Property="Margin" Value="0 0 0 10"/>
                                <Setter Property="FontSize" Value="20"/>
                                <Setter Property="Height" Value="Auto"/>
                                <Setter Property="IsEnabled" Value="True"/>
                                <Style.Triggers>
                                    <MultiDataTrigger>
                                        <MultiDataTrigger.Conditions>
                                            <Condition Binding="{Binding AdaptIsReady}" Value="false"/>
                                            <Condition Binding="{Binding UnitIsReady}" Value="false"/>
                                        </MultiDataTrigger.Conditions>
                                        <Setter Property="IsEnabled" Value="False"/>
                                    </MultiDataTrigger>
                                </Style.Triggers>
                            </Style>
                        </StackPanel.Resources>
                        <Button Content="FUT starten" DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}" Command="{Binding UpdateViewCommand}" CommandParameter="startFUT"/>
                        <Button Content="Manuell testen" DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}" Command="{Binding UpdateViewCommand}" CommandParameter="manuellTesting"/>
                        <Button Content="PVIS Befehle ausführen" DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}" Command="{Binding UpdateViewCommand}" CommandParameter="pvisAction"/>
                    </StackPanel>


        private bool adaptIsReady;
        public bool AdaptIsReady
        {
            get { return adaptIsReady; }
            set
            {
                if (adaptIsReady != value)
                {
                    adaptIsReady = value;
                    RaisePropertyChanged();
                }
            }
        }

        private bool unitIsReady;
        public bool UnitIsReady
        {
            get { return unitIsReady; }
            set
            {
                if (unitIsReady != value)
                {
                    unitIsReady = value;
                    RaisePropertyChanged();
                }
            }
        }

20.08.2021 - 13:19 Uhr

So einfach gehts, danke 🙂

20.08.2021 - 08:46 Uhr

Der Beitrag ist schon etwas älter, aber vielleicht lest ihr ja noch mit 🙂
Wie funktioniert das ganze, wenn das Control Template keinen Button enthält, sondern sowas in der Art:


<Style x:key="{x:Type custom:OverviewButton}" TargetType="{x:Type Button}">
        <Setter Property="Background" Value="Aqua"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid>
                        <Rectangle Grid.ColumnSpan="3" Grid.RowSpan="2" RadiusX="10" RadiusY="10" Fill="AliceBlue" Margin="10,20"/>
                        <Grid Margin="10,20">
                            
                            <Grid Width="30" Height="50" Background="yellow" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="20,0">
                                <Grid.Effect>
                                    <DropShadowEffect BlurRadius="20" RenderingBias="Quality" ShadowDepth="1"/>
                                </Grid.Effect>
                                <materialDesign:PackIcon Kind="{TemplateBinding Logo}" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0, 5"/>
                            </Grid>
                            <TextBlock Text="{TemplateBinding Heading}" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="10" FontFamily="Calibri" FontSize="25"/>
                            <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,20,10,0">
                                <TextBlock  Text="{TemplateBinding Text}" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Calibri" FontSize="55"/>
                            </StackPanel>
                        </Grid>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Dann funktioniert das mit den Default Style für einen Button ja nicht. Ich bräuchte da etwas Hilfe 🙂
Ich möchte das kompllete Template als Button ansehen und wenn ich den DefaultStyle eines Button ändere, soll in diesem Fall die Fill Value geändert werden.
Kann man das der Value mit einem Binding sagen?

Lg TheSoulT

17.08.2021 - 11:29 Uhr

Jemand noch eine Idee hier? 🙂

04.08.2021 - 13:20 Uhr

Hallo pinki,

das sieht doch gut aus. Danke dir!

Jetzt hab ich dabei noch das Problem, dass ich eine StaticResource nutze für meine Hauptfarbe (Siehe Zeile 10) die ich im ganzen Projekt nutze. Diese ist in der App.xaml definiert wie folgend:


<Application.Resources>
        <SolidColorBrush x:Key="clrPrimary" Color="#f7ba0b" />
    </Application.Resources>

Möchte ich jetzt den CustomButton aufrufen, bekomme ich die Fehlermeldung:
Die Ressource mit dem Namen "clrPrimary" kann nicht gefunden werden...

Den CustomButton an sich habe ich in der Generic.xaml erstellt. Dort wird jetzt auch die clrPrimary für den Background gesetzt.
Hast du oder jemand anderes hier auch noch einen Tipp?

04.08.2021 - 09:25 Uhr

Hey zusammen,

ich hoffe, ihr könnt mich bei einem weiteren Problem in meinem Projekt unterstützen.
Ich habe mir ein ControlTemplate als Grid Ressource erstellt (Im Anhang auch ein Screenshot von dem Ergebnis):


<Grid.Resources>
                <Style TargetType="Button">
                    <Setter Property="Background" Value="Aqua"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Grid>
                                    <Rectangle Grid.ColumnSpan="3" Grid.RowSpan="2" RadiusX="10" RadiusY="10" Fill="AliceBlue" Margin="10,20"/>
                                    <Grid Margin="10,20">
                                        <Grid Width="30" Height="50" Background="{StaticResource clrPrimary}" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="20,0">
                                            <Grid.Effect>
                                                <DropShadowEffect BlurRadius="20" RenderingBias="Quality" ShadowDepth="1"/>
                                            </Grid.Effect>
                                            <MaterialDesign:PackIcon Kind="About" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0, 5"/>
                                        </Grid>
                                        <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="10" FontFamily="Calibri"/>
                                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,20,0,0">
                                            <TextBlock Text="40/100" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Calibri" FontSize="35"/>
                                        </StackPanel>
                                    </Grid>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </Grid.Resources>

Hier sind zwei Texte und ein Logo, welche ich gern beim Aufruf des Template in xaml unterschiedlich belegen würde. Dazu hab ich schon die Info mit dem Binding an den Content gefunden, was auch super funktioniert. Aber wie kann ich den zweiten Text und das Logo ändern?


<Button Grid.Column="0" Grid.Row="1" Content="Offene Geräte&#xa;Eigen/Gesamt"/>

Ich benötige dann ja sowas wie Content2 = "" oder so. Kann man eigene Properties erstellen oder habt ihr eine Idee, wie ich hier weiterkomme? Hab dazu leider nichts gefunden.

Lg TheSoulT

21.02.2021 - 21:17 Uhr

Hallo zusammen,

ich hoffe ihr könnt mir hier etwas weiterhelfen. Ich möchte eine Datenbindung zwischen mehreren Pages erstellen. Ich habe auf der Seite "infos" eine Textbox. Auf meiner MainWindow Page soll ein Label den Inhalt der Textbox anzeigen. Mit unterschiedlichen Buttons kann man zwischen den Seiten wechseln.

Hier sind meine Codeteile:
MainWindow.cs


    public partial class MainWindow : Window
    {
        Person person1;
        public MainWindow()
        {
            InitializeComponent();
            person1 = new Person()
            {
                Name = "John Doe",
                City = "CiytNumberOne"
            };
            this.DataContext = person1;
        }

        private void btnDashboard_Click(object sender, RoutedEventArgs e)
        {
            PageHolder.Content = new dashboard();
        }

        private void Infos_Click(object sender, RoutedEventArgs e)
        {
            PageHolder.Content = new infos();
        }
    }

Person.cs


class Person : INotifyPropertyChanged
    {
        private string _name;
        private string _city;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                OnPropertyChanged("Name");
            }
        }
        public string City
        {
            get { return _city; }
            set
            {
                _city = value;
                OnPropertyChanged("City");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string info)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

MainWindow.xaml


<Grid>
        <StackPanel>
            <StackPanel Orientation="Horizontal">
                <Button x:Name="Infos" Content="Infos" Margin="10 0" Click="Infos_Click"/>
                <Button x:Name="btnDashboard" Content="Dashboard" Margin="10 0" Click="btnDashboard_Click"/>
            </StackPanel>
            <Label Content="Name:"/>
            <Label Content="{Binding Name}"/>
            <Separator/>
            <Frame x:Name="PageHolder" Source="infos.xaml" NavigationUIVisibility="Hidden" />
        </StackPanel>
    </Grid>

Könnt ihr mir hier bitte weiterhelfen bei der Datenbindung?

03.09.2020 - 08:20 Uhr

Danke Taipi88, der Tipp war goldrichtig! Man muss das Datum als double übergeben und nicht als formatierten String. So hab ich es jetzt:


DateTime odate = DateTime.Today;
excelWs.Cells[column, 8] = odate.ToOADate();
excelWs.Range["H" + column].NumberFormat = "m/d/yyyy";

Da das Datum dann trotzdem im falschen Format war, hab ich das o.g. NumberFormat gesetzt.
Das hab ich über ein Makro ausgelesen. Komischerweise ist dieses Format Tag.Monat.Jahr.

Also nochmals danke an euch 🙂

31.08.2020 - 23:17 Uhr

Also ich hab jetzt auf deinen Hinweis hin, den Code aus der OpenXML SDK kopiert, um zu testen, wie es hier läuft.
Auch auf diesem Weg hab ich genau das selbe Fehlerbild mit dem Filter.

31.08.2020 - 16:38 Uhr

Ich hab dazu unter Zelle formatieren geschaut. Dort gibt es ja Datumsformate. Hab mal einen Screenshot angehangen.
Mit deinem Vorschlag yyyy-mm-dd klappt es leider auch nicht.

Das ist so ärgerlich... Der Text steht eigentlich richtig drin, wird nur nicht korrekt erfasst von Excel 🙄

31.08.2020 - 16:25 Uhr

Hallo Abt,

ich hab es auch schon so getestet:


excelWs.Range["H" + column].NumberFormatLocal = "TT.MM.JJJJ";

Leider das selbe Problem weiterhin 🙁

31.08.2020 - 10:35 Uhr

Hallo zusammen,

ich hänge an einem kleinen Problem, was ich mithilfe der Suche und Google leider nicht lösen konnte.

Ich habe ein kleines Programm geschrieben, was in einer Excel-Tabelle das aktuelle Datum einträgt. Dieses wird auch ohne Probleme eingetragen. Leider hat Excel hier aber ein Problem mit der Filterfunktion.
Diese trennt die einzelnen Datumsteile nicht auf. Um das kurz zu erklären:
Trägt man von Hand ein Datum ein, erkennt der Filter dieses und spaltet auf in Jahr, Monat und Tag. Dann kann man zum Beispiel alle Einträge aus 2020 anzeigen lassen.

Wenn ich mit meinem Programm das Datum eintrage, wird es als komplettes Datum im Filter angezeigt. Dies kann manuell behoben werden über einen Doppelklick und ein Enter in die entsprechende Zelle.
Das ist aber ein manueller Eingriff und eigentlich unerwünscht.

Ich habe das ganze schon versucht zu lösen mit NumberFormat, was aber leider auch nicht geholfen hat. Hier mal mein Codeausschnitt:

                        
int column = LastColumn();

string[] splitData = txt_Daten.Text.Split();

excelWs.Cells[column, 3] = splitData[2];
excelWs.Cells[column, 2] = splitData[1];
excelWs.Cells[column, 1] = splitData[0];
excelWs.Cells[column, 4] = txt_Fert.Text;
excelWs.Cells[column, 8] = DateTime.Now.ToShortDateString();
excelWs.Range["H" + column].NumberFormat = "MM/DD/YYYY";
excelWs.Cells[column, 9] = DateTime.Now.ToShortTimeString();

Im Anhang noch ein Screenshot von dem Filter. Die letzte Zeile davon sollte eigentlich oben mit einsortiert werden.
Ich hoffe ihr habt eine Idee und könnt mir helfen? 🙂

29.05.2019 - 20:29 Uhr

Hallo Abt,

ja ich meinte vor dem Beenden tut mir leid.

Du hast richtig getippt, ich arbeite mit XAMARIN.
Meinst du mit Elementen die Elemente der Liste?
Also ich habe ja eine Liste mit Personen. Diese Personen enthalten jeweils den Vor und Nachnamen und das Geschlecht.

Das heißt ich muss die Personen speichern?

Benötige ich dafür SQL?

Ich find leider nichts passendes für mich im Internet X(

24.05.2019 - 20:55 Uhr

Hallo zusammen,
ich habe mal wieder ein Problem bei einem meiner Projekte.
Ich möchte eine App mit einer ListView erstellen.
Diese ListView wird von Usereingaben gefüttert und soll nach dem Beenden der App bei einem erneuten Aufruf wieder zur Verfügung stehen. Die ListView besteht aus mehreren Objekten "Person".
Ich bin bei meiner Recherche auf die SharedPreferences gestoßen.
Hier kann man aber leider keine List speichern.
Oder doch?
Könnt Ihr mir hier weiterhelfen?

Liebe Grüße
thesoult

26.04.2019 - 07:56 Uhr

Ich habe jetzt mal per HttpWebRequest mir den Code der Website auslesen lassen:


private void button1_Click(object sender, EventArgs e)
        {
            string url = "https://www.pilz.com/de-INT/search#SEARCH=772100&pilz_group_type=";
            
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            
            Stream receiveStream = myHttpWebResponse.GetResponseStream();
            Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
            
            StreamReader readStream = new StreamReader(receiveStream, encode);
            Console.WriteLine("\r\nResponse stream received.");
            Char[] read = new Char[256];
            
            int count = readStream.Read(read, 0, 256);
            Console.WriteLine("HTML...\r\n");
            while (count > 0)
            {
                String str = new String(read, 0, count);
                Console.Write(str);
                count = readStream.Read(read, 0, 256);
            }
            Console.WriteLine("");
            
            myHttpWebResponse.Close();
            readStream.Close();
        }

Das Ergebnis war unter anderem:

<form class="treffer">
                            Anzahl der Suchergebnisse <span id="pilz-fts-search-result-amount">123</span>
                            <select id="resultsPerPage" size="1" title="Ergebnisse pro Seite">
                                <option value="10">10</option>
                                <option value="20">20</option>
                                <option value="30">30</option>
                                <option value="40">40</option>
                                <option value="50">50</option>
                            </select>
                        </form>
                        <div id="pilz-fts-search-results-container"></div>
                    </div>
                    <nav>
                        <ul class="pagination" id="pilz-fts-search-pagination-container">

wobei hier ja die Zeile

                        <div id="pilz-fts-search-results-container"></div>

interessant ist. Hier scheint es so, als ob der Bereich dazwischen nicht existiert.
Gerade ist mir ausfgefallen, das wenn ich die Website untersuche und über den Debugger rein geh, sieht es identisch aus wie oben. Über den DOM-Explorer sind allerdings zwischen <div id="pilz-fts-search-results-container"> und </div> noch die Links, welche ich benötige 8o

25.04.2019 - 20:40 Uhr

Ich bin dabei, aber weiß allerdings nicht nach was ich genau suchen soll ?(

25.04.2019 - 20:19 Uhr

Hallo Abt,

mein Debugger sagt: "att" war "null".
Und link.Attributes["href"] ist ebenfalls null.

25.04.2019 - 19:41 Uhr

Hallo Abt,
danke für die schnelle Rückmeldung.

Das a[2] hab ich auch schon weggelassen.
Dann ist die NullReferenceException an der Stelle weg, allerdings findet er keine Links und gibt mir bei

                if (att.Value.Contains("#"))

eine NullReferenceException, weil keine Links hier vorhanden sind.

X(

25.04.2019 - 19:16 Uhr

Halo zusammen,

ich benötige mal wieder eure Hilfe 🙂
Nach tagelanger Suche bin ich leider mit meinem Programm noch am Anfang, weil ich hier nicht weiter komme.
Ich möchte von einer Website alle Links auslesen.
Dies habe ich mit folgendem Code versucht:

private void button1_Click(object sender, EventArgs e)
        {
            var url = "https://www.pilz.com/de-DE/search#SEARCH=772100&pilz_group_type=";
            var web = new HtmlWeb();
            var doc = web.Load(url);

            var node = doc.DocumentNode.SelectNodes("//*[@id=\"pilz-fts-search-results-container\"]/a[2]");

            foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//*[@id=\"pilz-fts-search-results-container\"]/a[2]"))
            {
                HtmlAttribute att = link.Attributes["href"];
                if (att.Value.Contains("#"))
                {
                    string[] substring = att.Value.Split('#');
                    Console.ForegroundColor = ConsoleColor.Blue;
                    Console.Write(substring[0]);
                    Console.ReadLine();
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Blue;
                    Console.WriteLine(att.Value);
                    Console.ReadLine();
                }
            }
        }

In der foreach-Schleife bekomm ich ein NullException-Error.
Deshalb habe ich die var node erstellt, um zu sehen ob ich null bekomme, was hier der Fall ist.
Könnt Ihr mir sagen was an dem XPATH nicht in Ordnung ist?

Hier noch der Link zur Website:
https://www.pilz.com/de-DE/search#currentPage=1&SEARCH=772100&search_connector=and

Wenn es genauer geht mit den Links:
Ich möchte die Links in der Mitte haben (Wo ein Pfeil davor ist)

Ich hoffe ihr könnt mir helfen 😁

Grüße
theSoulT

12.03.2019 - 18:30 Uhr

Im Sinne der Wiederverwendbar- und Testbakeit ist es besser, wenn Deine Methode keine Abhängigkeit an die UI und damit keine Abhängigkeit an die Textbox hätte; sondern wie meine Vorlage einen String annimmt und einen zurück gibt.

Du hast recht, das muss ich noch anpassen. Danke dir!

09.03.2019 - 00:10 Uhr

Hab es hinbekommen. Danke für deinen Ansatz!
Hier noch mein Code, falls jemand anderes noch die selben Probleme hat:

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (counter == 0)
                Blockformat(textBox1, 40);
        }
        public void Blockformat(TextBox source, int maxCharsPerLine)
        {
            string gesamttext = source.Text;
            string zeile = "";
            int lastSpace;
            List<string> satz = new List<string>();

            counter = 1;
            if (gesamttext.Length >= maxCharsPerLine)
            {
                while (gesamttext.Length > 0)
                {
                    int min = Math.Min(gesamttext.Length, maxCharsPerLine);
                    zeile = gesamttext.Substring(0, min);
                    lastSpace = zeile.LastIndexOf(" ") + 1;

                    if (lastSpace > 0)
                    {
                        if (gesamttext.Length > maxCharsPerLine)
                        {
                            zeile = gesamttext.Substring(0, lastSpace);
                            gesamttext = gesamttext.Substring(lastSpace).Replace(Environment.NewLine, "");
                        }
                        else
                            gesamttext = "";
                        satz.Add(zeile);
                    }
                    else
                    {
                        zeile = gesamttext.Substring(0, min);
                        if (zeile != "")
                            satz.Add(zeile);
                        gesamttext = gesamttext.Substring(min).Replace(Environment.NewLine, "");
                    }
                }
                source.Text = "";
                foreach (string s in satz)
                {
                    source.Text += s + Environment.NewLine;
                }
                source.Text = source.Text.Substring(0, source.Text.Length - Environment.NewLine.Length);
                source.SelectionStart = source.Text.Length;
                source.ScrollToCaret();
            }

            counter = 0;
        }