Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Hunv
Thema: Live Tile-Counter via Windows Push Notification Service
Am im Forum: GUI: WPF und XAML

Hast du eine Referenz dafür? Ich finde leider nichts in die Richtung auf den Microsoft-Seiten oder wir meinen nicht das Gleiche.

Damit wir uns nicht missverstehen: Meine App läuft nicht oder nur "pausiert" im Hintergrund, wenn ein Push-Update eintrifft. Wäre ja auch zwecklos, wenn meine App laufen müsste um einen ungesehen-counter auf der Startseite hoch zu setzen.

Thema: Live Tile-Counter via Windows Push Notification Service
Am im Forum: GUI: WPF und XAML

Hallo zusammen,

ich versuche gerade ein Live Tile zu erstellen, welches mir die Anzahl von ungelesenen Benachrichtigungen anzeigt. Da dies nicht durch die App beim Ausführen dieser gesteuert werden kann, muss ich dafür auf die Windows Push Notification Services (WNS) zurückgreifen.
Das Pushen an sich ist kein Problem. Das bekommen ich für Toast-Nachrichten bereits hin. Mein Problem ist nun, wie ich einen Counter auf dem Endgerät um 1 durch eine Push-Nachricht erhöhen kann.
Ich kann absolute Werte (=Texte) ohne Probleme in das Live-Tile machen, aber ich habe bisher keine Möglichkeit gefunden relative Werte zu senden (z.B. "erhöhe um 1").
Das was ich machen möchte ist im Prinzip vergleichbar mit der Anzahl an ungelesenen E-Mails in einem Live Tile. Da wissen Microsofts Server ja auch nicht, wie viele das nun wirklich sind (hoffe ich zumindest, wenn man seine Mails nicht dort hat). Trotzdem wird das Live Tile um 1 erhöht ohne dass ich die E-Mail-App geöffnet habe.

Thema: Loaded-Event löst im mehrfach vererbten User-Control nicht mehr aus.
Am im Forum: GUI: WPF und XAML

Hi ujr,

ich habe einmal eine minimale Anwendung erstellt.
Dabei ist mir zu meiner Verwunderung aufgefallen, dass das Problem nur aufzutreten scheint, wenn ich das Control via Binding in das Dock einbette.
Wenn ich das Control direct in die Form oder direkt in das Dock via XAML lege, wird Loaded aufgerufen.

Ich habe das Minimalprojekt einmal angehängt.

Thema: Loaded-Event löst im mehrfach vererbten User-Control nicht mehr aus.
Am im Forum: GUI: WPF und XAML

Nachdem ich nun einen ziemlich frustrierenden Tag damit verbracht habe dem Problem auf die Spur zu kommen habe ich folgendes festgestellt:

Wenn ich in dem Constructor von TabBase und/oder TabHuman das Event abonniere und in der Methode dazu eine Exception schmeiße, wird diese Exception im Designer angezeigt.


        public TabBase()
        {
            this.Loaded += TabBase_Loaded;
        }

        void TabBase_Loaded(object sender, System.Windows.RoutedEventArgs e)
        {
            throw new NotImplementedException("TabBase_Loaded");
        }

Wenn ich das Projekt compiliere und starte gibt es aber keine Exception. Auch im Output-Fenster steht nichts. Wende ich das gleiche ausschließlich auf das TabHumanEuropean an, passiert nichts. Der Designer zeigt keinen Fehler mehr an, compilieren und starten geht.
Mir will einfach nicht in den Kopf, warum das Loaded-Event nicht aufgerufen wird.

Des Weiteren Funktionieren im TabHumanEuropean scheinbar alle anderen Events, nur das Loaded-Event nicht.
Wie bereits geschrieben, funktioniert das Initialized Event. Auch das Loaded-Event des eingebetteten Grids wird aufgerufen. Nur eben nicht das Loaded-Event des Controls selbst.
Auch ein "manuell" definiertes Event im Constructor wird nicht aufgerufen:

        public TabHumanEuropean()
        {
            InitializeComponent();
            
            this.Loaded += TabHumanEuropean_Loaded;
        }

        void TabHumanEuropean_Loaded(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Loaded by Constructor-Loaded");
        }

Thema: Loaded-Event löst im mehrfach vererbten User-Control nicht mehr aus.
Am im Forum: GUI: WPF und XAML

Zitat von MrSparkle
Ein ViewModel ist kein Steuerelement, und erbt daher auch nicht von UserControl.
Ja, da hast du Recht. Das ganze ist etwas gewachsen und nicht final. Primär geht es mir um das Problem und nicht um die Struktur.
Zitat von MrSparkle
Du hast keine Ereignisse definiert
Das Loaded-Event wird doch von UserControl mitvererbt? Beim "ViewModelTabHuman" klappt das ganze ja auch.

Zitat von MrSparkle
Deine Methoden sind als private deklariert und daher von außen nicht zugreifbar
Ja, das ist richtig. Da das Control es selbst aufruft, funktioniert es aber. Bitte die Namensgebung ignorieren. Es ist definitiv kein ViewModel - anders als es benannt ist. Das muss ich noch korrigieren, wenn ich das grundsätzliche Problem gelöst habe.


Edit:
Ich habe im Ursprungs-Post einmal den Begriff "ViewModel" entfernt um Verwirrungen zu vermeiden und den Fokus auf das Problem und nicht das drum herum zu lenken.

Thema: Loaded-Event löst im mehrfach vererbten User-Control nicht mehr aus.
Am im Forum: GUI: WPF und XAML

Hi,

ich habe ein Problem.
Ich habe ein UserControl, dass von einem UserControl erbt, das von einem UserControl erbt, das von UserControl und INotifiyPropertyChanged erbt.

Der Reihe nach: Hier einmal die Basis, die von UserControl und INotifyPropertyChanged erbt:

namespace myapp
{
public class TabBase : UserControl, INotifyPropertyChanged
    {
        public TabBase()
        {
        }

        private string _Title = "Unnamed";
        public string Title
        {
            get { return _Title; }
            set
            {
                if (_Title == value) return;

                _Title = value;
                RaisePropertyChanged("Title");
            }
        }

        #region PropertyChanged
        protected virtual void RaisePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;
        #endregion
    }
}

Hier die Klasse, die davon erbt:

namespace myapp
{
    public class TabHuman : TabBase
    {
        public string Firstname { get; set; }
        public string Lastname { get; set; }
    }
}

Und hier das UserControl, welches das "Endprodukt" darstellt:

namespace myapp.Tabs.TabHumanEuropean
{
    public partial class TabHumanEuropean
    {
        public TabHumanEuropean()
        {
            InitializeComponent();
        }

        private void TabHuman_Loaded(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Loaded");
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(this.IsLoaded.ToString());
        }

    }
}

und der XAML-Code:
<tabs:TabHuman x:Class="myapp..Tabs.TabHumanEuropean.TabHumanEuropean"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:="clr-namespace:myapp.tabs"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             Loaded="TabHuman_Loaded"
             DataContext="{Binding RelativeSource={RelativeSource Self}}"
            >
    <Grid Background="Red">
        <Button Content="Show" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    </Grid>
</tabs:TabHuman>

Im letzten der drei Klassen wird nun aber das "Loaded"-Event nicht ausgelöst und die Eigenschaft "IsLoaded" bleibt auf false. Im Gegensatz dazu wird das Initialized-Event (nicht im Code) aber aufgerufen.
Wenn ich jetzt nicht von TabHuman erben lasse, sondern von TabBase funktioniert das Loaded-Event.
Ich kann mir das nicht so richtig erklären. Kann mir hier jemand weiterhelfen? Was habe ich für Möglichkeiten das Problem zu lösen?

Thema: WPF, MVVM und CommandBindings
Am im Forum: GUI: WPF und XAML

Hi Coffeebean,

vielen Dank für deine Antwort. Das hat mir sehr weitergeholfen!
Ob ich wirklich für jeden Click eine eigene Klasse mache oder ob ich das in der Praxis dann ggf. doch anders mache, wird sich zeigen. Erstmal aber möchte ich es mit eigenen Klassen machen um zu wissen wie es dann in der Theorie und Praxis mal alles funktionieren würde.

Thema: WPF, MVVM und CommandBindings
Am im Forum: GUI: WPF und XAML

Hi,

ich möchte gerne ein Programm schreiben, welches MVVM-conform ist. Dazu gehört auch, soviel ich bisher verstanden habe, nicht die "klassischen" z.B. Button_Click-Events eines Controls zu benutzen, sondern dies über CommandBindings umzusetzen.
Dazu habe ich bisher folgendes gemacht:

XAML:

<RibbonWindow 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MvvmTest.GUI_v2.ViewModels"
        xmlns:cmds="clr-namespace:MvvmTest.GUI_v2.ViewModels.Commands"
        x:Class="MvvmTest.GUI.MainWindow"
        Title="MvvmTest"      
        Height="600"
        Width="800"
        WindowState="Normal"
        WindowStartupLocation="CenterScreen"    
        >
    <RibbonWindow.DataContext>
        <local:ViewModelMain />
    </RibbonWindow.DataContext>

    <RibbonWindow.CommandBindings>
	<!-- Geht nicht -->
        <CommandBinding Command="cmds:Login.CmdLogin" CanExecute="Login_CanExecute" Executed="Login_Executed" />
	<!-- Geht auch nicht -->
        <CommandBinding Command="cmds:Login.CmdLogin" CanExecute="cmds:Login.Login_CanExecute" Executed="cmds:Login.Login_Executed" />    
</RibbonWindow.CommandBindings>

    <Grid>
        <Button Content="Login" Command="cmds:Login.CmdLogin" HorizontalAlignment="Left" VerticalAlignment="Top" IsDefault="True" Width="200"  Margin="0,0,0,5"/>
    </Grid>
</RibbonWindow>

Mein ViewModelMain (NameSpace: MvvmTest.GUI.ViewModels) ist zur Zeit noch leer.
Für die Commands möchte ich gerne im NameSpace MvvmTest.GUI.ViewModels.Commands jeweils eine Klasse erstellen, in denen dann die gewünschten Aktionen durchgeführt werden sollen.

Eine so eine Klasse sieht z.B. so aus:


namespace MvvmTest.GUI_v2.ViewModels.Commands
{
    public class Login
    {
        public static RoutedUICommand CmdLogin = new RoutedUICommand("Login", "Login", typeof(Login));

        public void Login_CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
            //e.Handled = true;
        }

        public void Login_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            Console.Beep();
        }
    }
}

Mein Problem ist nun:
wie bekomme ich dem CommandBinding Beigebracht, dass er aus der Klasse Login das CanExecute und Executed aufrufen soll und nicht aus der CodeBehind-Datei? Im XAML Code oben habe ich bereits zwei Möglichkeiten ausprobiert, welche mir logisch erschienen, aber beide nicht funktionieren.

Bei der ersten Variante gibt es den Fehler
Fehler
'MvvmTest.GUI.MainWindow' does not contain a definition for 'Login_Executed' and no extension method 'Login_Executed' accepting a first argument of type 'MvvmTest.GUI.MainWindow' could be found (are you missing a using directive or an assembly reference?)
Hier sucht er in der Code-Behind-Datei nach den Methoden.

Bei der zweiten Variante gibt es den Fehler:
Fehler
CanExecute="cmds:Login.Login_CanExecute" is not valid. 'cmds:Login.Login_CanExecute' is not a valid event handler method name. Only instance methods on the generated or code-behind class are valid.

Beides kompiliert nicht.

Des weiteren hatte ich auch schon versucht die Login-Klasse sowie die (Can)Execute-Methoden static zu machen, aber auch das hat in der Verzweiflung nichts am Fehler und den Meldungen geändert.

Ich bin ein wenig ratlos und finde auch über den Freund mit den 6 Buchstaben keine Lösung, die mir im Ansatz weiterhilft. In die CodeBehind-Datei möchte ich eigentlich nichts schreiben.

Thema: Suche professionelle 3D Icons für Win Applikation
Am im Forum: Smalltalk

Hi,

Ich benutze für meine Projekte Axialis Icon Workshop (http://www.axialis.com/iconworkshop/). Kostet einmalig etwas Geld und man hat dann einige hundert Icons auf dessen Grundlage man in deren Designer die Icons modifizieren, kombinieren oder wie auch immer verändern kann.
Kann ich nur empfehlen. Ist einfach und unkompliziert.

Thema: ComboBoxItem automatisch auswählen beim Öffnen
Am im Forum: GUI: WPF und XAML

Hi Mammut,

soweit ich weiß, musst du noch ein PropertyChanged senden.

Dazu musst du zunächst dein Window oder Usercontrol von INotifiyPropertyChanged ableiten.
Dann musst du ein Event "PropertyChangedEventHandler" erstellen.

public event PropertyChangedEventHandler PropertyChanged;
Nachdem dann SelectedKunde und die Liste geändert wurden, rufst du PropertyChanged auf um dem Control mitzuteilen, dass es die Bindings bitte aktualisieren soll.

if (PropertyChanged != null)
{
     PropertyChanged(this, new PropertyChangedEventArgs("ListKunden"));
     PropertyChanged(this, new PropertyChangedEventArgs("SelectedKunde"));
}

Thema: XamlParseException durch Festlegen einer nicht vorhandenen Variable
Am im Forum: GUI: WPF und XAML

So, nachdem ich jetzt den nächsten Tag gesucht habe, ist mir aufgefallen woher der Fehler kommt:
Die Original-Datei der "GenericTreeView.dll" heißt "Hardcodet.Wpf.GenericTreeView.dll". Den Namen habe ich gekürzt. Wenn die Assembly (/Referenz) den Originalname trägt, dann gibt es keinen Fehler.
Was ich aber nicht verstehe ist, warum ich die DLL nicht umbennen kann. Bisher bin ich immer davon ausgegangen, dass letztendlich Namespace etc. wichtig sind und der Dateiname der DLL eigentlich unwichtig ist. War das eine falsche Annahme oder sollte das in der Regel gehen? Wenn es eigentlich gehen sollte, wieso geht es in diesem Fall nicht?
Ich kann im Code nirgends eine Verweis auf den Originalnamen der DLL finden.

Thema: XamlParseException durch Festlegen einer nicht vorhandenen Variable
Am im Forum: GUI: WPF und XAML

Hi,

ich weiß nicht, ob dies direkt mit WPF zu tun hat, aber da mein Fehler auf XAML-Code verweist, mache ich es einmal hier auf. Sollte es woanders ehr hingehören, darf der Thread gerne verschoben werden.

Ich bin derzeit dabei auf Basis dieses TreeViews ein TreeView für meine Bedürfnisse anzupassen.
Ich habe hierbei jedoch ein Problem, welches ich nicht ganz nachvollziehen kann.

Ich habe das "Original" ein wenig reduziert und in ein Test-Projekt von mir eingebunden. Wenn ich jetzt mein Test-Projekt ausführe, bekomme ich eine XamlParseException, die mich auf mein ViewModel verweisst. Die genaue Meldung lautet hier:

Fehler
Zeilennummer "9" und Zeilenposition "14" von "Durch das Festlegen von connectionId wurde eine Ausnahme ausgelöst."
.
Das Ding ist aber: ich habe nichts, was "connectionId" heißt. Auch das WPF TreeView aus dem oben angegebenen Link hat nichts, dass diesen Namen trägt.
Wenn ich den Projektordner im Explorer nach diesem String durchsuche, dann finde ich ihn in einer .g.cs-Datei. Dort wird es als Parameter übergeben:


void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target)

Die InnerExecption sagt nur
Fehler
""Die Datei oder Assembly \"Hardcodet.Wpf.GenericTreeView, Version=1.0.6.33174, Culture=neutral, PublicKeyToken=null\" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.":"Hardcodet.Wpf.GenericTreeView, Version=1.0.6.33174, Culture=neutral, PublicKeyToken=null"}".
Das klingt für mich ersteinmal so, dass er das TreeView nicht finden kann. Das kann ich erstmal nicht nachvollziehen, weil es im Zielordner vorhanden ist und auch im Designer funktioniert.

Ich habe zwar nun die Erkenntniss, dass das er scheinbar irgendein Problem mit der connectionId hat, aber viel weiter komme ich nicht.

Meine letzten Versuche waren einfach alles nochmal von vorne zu machen, aber auch das läuft immer wieder auf die gleichen Probleme hinaus. Ich kann hierbei auch nicht genau nachvollziehen nach welcher Änderung es nicht mehr geht. Ich war auch schon soweit, dass ich dachte, dass es nun geht, weil in der Testapplikation alles OK war, habe den complile-Modus auf Release gestellt und ab dem Moment ging es nicht mehr - weder im Release noch im Debug-Modus.

Ich habe das Projekt einmal angehägt, vielleicht kann jemand von euch einmal ein Blick drüber werfen? Ich komme hier leider echt nicht weiter :(

Thema: [erledigt] TreeView ItemsSource Binding in eigenem Control
Am im Forum: GUI: WPF und XAML

Hi,

danke WinSharp93, das war auf jeden Fall ein guter Tipp.
Ich habe mich dazu entschlossen mein komplettes TreeView neu zu Bauen. Als Ausgang benutze ich dieses TreeView-Control, welches meinen Bedürfnissen schon sehr gut entspricht:
http://www.codeproject.com/Articles/23337/A-Versatile-TreeView-for-WPF
Damit habe ich gerade ein Problem, aber dazu mache ich gleich einmal ein neuen Thread auf.

Thema: [erledigt] TreeView ItemsSource Binding in eigenem Control
Am im Forum: GUI: WPF und XAML

Hy Syl3x,

danke für deine Antwort. Leider funktioniert das auch nicht.
Weiterhin wird kein get aufgerufen.
Zusätzlich werden nun in meinem Control alle Command-Parameter der im Control enthaltenen Controls mit folgendem Fehler beanstandet:
Error 4 'ConnectionList' property was already registered by 'UserControl'.

Hast du ggf. noch eine Idee?

Thema: [erledigt] TreeView ItemsSource Binding in eigenem Control
Am im Forum: GUI: WPF und XAML

Moinmoin,

ich habe ein Problem mit Binding.
Ich habe mein Hauptfenster, in dem ich ein eigenes Control haben, in dem u.a. ein Treeview enthalten ist, welches an meine Bedürfnisse angepasst ist.
Jetzt möchte ich den Inhalt des TreeViews via Binding setzen.

Dazu habe ich folgendes im Control gemacht:
C# (DependencyProperty erstellt):

public List<ImagedConnectionTreeViewItem> ConnectionList
        {
            get { return (List<ImagedConnectionTreeViewItem>)GetValue(ConnectionListProperty); }
            set { SetValue(ConnectionListProperty, value); }
        }

        // Using a DependencyProperty as the backing store for ConnectionList.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ConnectionListProperty =
            DependencyProperty.Register("ConnectionList", typeof(List<ImagedConnectionTreeViewItem>), typeof(ImagedConnectionTreeView), new PropertyMetadata(new List<ImagedConnectionTreeViewItem>()));

XAML:
Im Header:
DataContext="{Binding RelativeSource={RelativeSource Self}}"

Im TreeView:

<my:ImagedConnectionTreeViewControl x:Name="tvConnectionList" ItemsSource="{Binding ConnectionList}">


In meinem Window, wo das Control eingebunden ist, versuche ich nun via Binding das ItemsSource (bzw. "ConnectionList") zu setzen:

Im Code:


public List<ImagedConnectionTreeViewItem> ConnectionList
        {
            get 
            {
                List<ImagedConnectionTreeViewItem> tvNodes = new List<ImagedConnectionTreeViewItem>();
                tvNodes.Add(new ImagedConnectionTreeViewItem("Test"));
                tvNodes.Add(new ImagedConnectionTreeViewItem("Test2"));
                tvNodes.Add(new ImagedConnectionTreeViewItem("Test3"));
                tvNodes.Add(new ImagedConnectionTreeViewItem("Test4"));
                tvNodes.Add(new ImagedConnectionTreeViewItem("Test5"));
                tvNodes.Add(new ImagedConnectionTreeViewItem("Test6"));
                return(tvNodes);
            }
        }

XAML:

<my1:ImagedConnectionTreeView Name="tvConnectionList" ConnectionList="{Binding ConnectionList, diag:PresentationTraceSources.TraceLevel=High}"/>


Wenn ich das Binding nicht auf mein Control, sondern auf ein normales TreeView setze, dann werden dort die Einträge eingezeigt. Daher vermute ich, dass beim meinem eigenen Control irgendetwas mit dem Binding nicht hinhaut.
Beim Binding an mein Control wird keines des gets in den Properties aufgerufen. Beim Standard-Treeview jedoch schon.
Das Output des Traces zeigt nur das hier, was aber keine Fehler enthält:
Fehler
System.Windows.Data Warning: 56 : Created BindingExpression (hash=40762510) for Binding (hash=38640643)
System.Windows.Data Warning: 58 : Path: 'ConnectionList'
System.Windows.Data Warning: 60 : BindingExpression (hash=40762510): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=40762510): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=40762510): Attach to beRemote.GUI.Controls.Controls.ImagedConnectionTreeView.ConnectionList (hash=14638410)
System.Windows.Data Warning: 67 : BindingExpression (hash=40762510): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=40762510): Found data context element: ImagedConnectionTreeView (hash=14638410) (OK)
System.Windows.Data Warning: 78 : BindingExpression (hash=40762510): Activate with root item ImagedConnectionTreeView (hash=14638410)
System.Windows.Data Warning: 107 : BindingExpression (hash=40762510): At level 0 using cached accessor for ImagedConnectionTreeView.ConnectionList: DependencyProperty(ConnectionList)
System.Windows.Data Warning: 104 : BindingExpression (hash=40762510): Replace item at level 0 with ImagedConnectionTreeView (hash=14638410), using accessor DependencyProperty(ConnectionList)
System.Windows.Data Warning: 101 : BindingExpression (hash=40762510): GetValue at level 0 from ImagedConnectionTreeView (hash=14638410) using DependencyProperty(ConnectionList): List`1 (hash=28531151 Count=0)
System.Windows.Data Warning: 80 : BindingExpression (hash=40762510): TransferValue - got raw value List`1 (hash=28531151 Count=0)
System.Windows.Data Warning: 89 : BindingExpression (hash=40762510): TransferValue - using final value List`1 (hash=28531151 Count=0)

Hat jemand eine Idee? Übersehe ich etwas oder habe ich etwas vergessen?

Thema: Width, Height, Left, Top und WindowState eines Windows per Binding setzen?
Am im Forum: GUI: WPF und XAML

Ja, das kann ich bestätigen. Bei meiner Suche bin ich da auch drüber gestolpert.

Thema: Width, Height, Left, Top und WindowState eines Windows per Binding setzen?
Am im Forum: GUI: WPF und XAML

Hi xxMUROxx,

vielen Dank für deine Antwort. Das ist eine Variante an die ich so noch gar nicht gedacht habe. Mal sehen wie ich das umgesetzt bekomme ;)

Thema: Width, Height, Left, Top und WindowState eines Windows per Binding setzen?
Am im Forum: GUI: WPF und XAML

Hallo zusammen,

möchte gerne beim Start meines Programms die letzte Ansicht des Benutzers, sprich Höhe, Breite und Position sowie Zustand des Fensters, wieder anzeigen.

Ein einfaches

Top="{Binding WindowTop}"
auf die Property WindowTop funktioniert leider nicht.
Ich habe bereits ein wenig recherchiert und herausgefunden, dass das auch so nicht geht, sondern drum herum noch mehr gemacht werden muss. Leider habe ich keinen Artikel gefunden, der mir jetzt zeigt was genau gemacht werden muss.
Hat jemand von euch eine Idee, Beispiel oder Link was ich dabei noch alles beachten muss?

Viele Grüße
Kristian

Thema: beRemote - Projekt: Remote Connection Manager
Am im Forum: Projekte

Hallo zusammen,

wir haben nun unsere zweite Version von beRemote, den Release Preview 2, rausgebracht.
Wie der Name schon sagt: Es ist noch nicht die finale Version. Dazu fehlen noch zu viele Features, aber es ist ein weiterer Schritt in die Richtung.

Wir haben beim Release Preview 2 einige Verbesserungen an der Performance vorgenommen, sowie unser integriertes Pluginsystem erweitert. Außerdem unterstützen wir nun auch VNC und haben einige Verbesserungen an der Benutzeroberfläche vorgenommen (Drag-n-Drop, QuickConnect-Buttons, Tooltips mit Verbindungsinformationen, verbesserte History uvm.).

Ihr seit herzlich eingeladen unser zweites Release zu testen:
Download x86
Download x64

In kürze wird es im übrigen eine Dokumentation zu unserer Plugin-Schnittstelle geben, sodass jeder Plugins für beRemote entwickeln kann.
Für Ideen, Kritik, Featurewünsche und Bugmeldungen sind wir natürlich wie immer dankbar.

PS:
Umgesetzte Änderungen auf Grund eurer Beiträge:
- Datenbank liegt nun per default unter Appdata
- Es gibt nun Parameter zum aufrufen von beRemote

PPS:
Wer Lust hat und sofort über neue Features informiert werden möchte, kann uns seit einiger Zeit auch auf Twitter folgen:beRemoteTeam

Thema: [solved] Problem mit TreeView und Drag-n-Drop
Am im Forum: GUI: WPF und XAML

Hi ErfinderDesRades,

noch eine Kurze Rückmeldung:
der Hinweis mit nicht jedes einzelne Item behandeln war die Lösung, danke!
Dass das MVVM-Pattern derzeit nicht ganz eingehalten wird, ist mir bewusst. Das ist mein erstes WPF-Projekt und die Erfahrung wächst mit der Zeit. Wenn ich weiß was ich tue, werde ich das Control auch nochmal neu schreiben, aber im Moment muss es erstmal nur laufen ;)

Zu Vollständigkeit:
Nachdem ich

<TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type myClasses:ImagedConnectionTreeViewItem}">
                    <EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
                    <EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
                    <EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
                </Style>
            </TreeView.ItemContainerStyle>
durch
<TreeView.Style>
                <Style TargetType="{x:Type my:ImagedConnectionTreeViewControl}">
                    <EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
                    <EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
                    <EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
                </Style>
            </TreeView.Style>
ersetzt habe, war alles wie gewünscht!

Danke nochmal!

Thema: [solved] Problem mit TreeView und Drag-n-Drop
Am im Forum: GUI: WPF und XAML

Hi

ich habe folgendes Problem. Ich habe in WPF ein Treeview erstellt, welches noch ein paar mehr Funktionalitäten hat. Dazu habe ich ein eigenes TreeViewItem erstellt, welches u.a. ein Icon anzeigen kann. Auch Drag-n-Drop ist implementiert um ein Eintrag an eine andere Stelle im TreeView ziehen zu können.
Die Einträge des Treeviews werden via TreeView.Resources angezeigt und in mein TreeViewItem "umgewandelt".

Nun habe ich das Problem, dass die Root-Elemente des Treeviews dieses Style nicht annehmen. Alle andere TreeViewItems, die den Root-Elementen untergeordnet sind, zeigen das Style korrekt an. Die Root-Elemente werden also z.B. ohne Icon als standard TreeViewItem angezeigt.
Wenn ich den letzten Teil für das Drag-n-Drop rausnehme (den Teil mit TreeView.ItemContainerStyle), dann wird alles korrekt angezeigt, aber Drag-n-Drop funktioniert natürlich nicht mehr.

Hat jemand eine Idee warum das Verhalten so ist und was ich dagegen tun kann?

Hier der XAML-Code:

<my:ImagedConnectionTreeViewControl Background="#FFFFFFFF" Foreground="#FFFFFFFF" Margin="0,-2,0,0" x:Name="tvConnectionList" BorderThickness="0" SelectedItemChanged="tvConnectionList_SelectedItemChanged" AllowDrop="True" >
	<TreeView.ContextMenu>
		<ContextMenu>
			<MenuItem Command="my:ImagedConnectionTreeView.AddFolder" Header="Add Folder" IsEnabled="True" />
			<MenuItem Command="my:ImagedConnectionTreeView.AddSetting" Header="Add Connection" IsEnabled="True" />
		</ContextMenu>
	</TreeView.ContextMenu>
	<TreeView.Resources>
		<Style TargetType="{x:Type myClasses:ImagedConnectionTreeViewItem}">
			<Setter Property="HeaderedItemsControl.HeaderTemplate">
				<Setter.Value>
					<DataTemplate>
						<StackPanel Orientation="Horizontal"
									Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type myClasses:ImagedConnectionTreeViewItem}}}">
							<Image Height="16" Source="{Binding Path=Icon, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type myClasses:ImagedConnectionTreeViewItem}}}" Stretch="Fill" Width="16" />
							<TextBlock Text="{Binding}" />
						</StackPanel>
					</DataTemplate>
				</Setter.Value>
			</Setter>
		</Style>
	</TreeView.Resources>
	<TreeView.ItemContainerStyle>
		<Style TargetType="{x:Type myClasses:ImagedConnectionTreeViewItem}">
			<EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
			<EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
			<EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
		</Style>
	</TreeView.ItemContainerStyle>
</my:ImagedConnectionTreeViewControl>

Thema: In Textbox Tastenkombinationen deaktivieren
Am im Forum: GUI: WPF und XAML

Hi,

ich brauche einmal einen Rat zu beeVNC, da ich selbst irgendwie nicht weiter komme:

ich habe eine unsichtbare Textbox über das gesamte Control gelegt, damit ich alle Arten von Sonderzeichen etc. abfangen kann. WPF hat da leider (so viel ich herausgefunden habe) keine vernünftige Lösung jedes beliebige Zeichen in einen Keycode umzuwandeln.

Wenn nun also einer einen Text in dem VNC-Fenster eingibt, wird der Text genommen, der eingegeben wurde (nur das 1. Zeichen) und an die Remotesession gesendet. Funktioniert auch soweit so gut. Sondertasten werden hier anders behandelt, aber das tut jetzt nichts zum Problem.

Das Problem fängt nun da an, wo Tastenkombinationen ins Spiel kommen, die auch eine Textbox annimmt (Strg+C, Strg+V, Strg+X usw.).
Hier wird an das Remotefenster nicht das Zeichen (also C, V, X, ...), sondern das Ergebnis des Commands (also Copy, Paste, Cut, ...) an die Remotesitzung übertragen, da ja die lokale Textbox diesen Befehl in das Ergebnis "umwandelt".

Beispiel:
In der Remotesitzung habe ich ein Notepad offen. Zudem habe ich lokal und remote im Zwischenspeicher den Text "super Seite: www.mycsharp.de". Diesen will ich jetzt in das leere Notepad einfügen. Ich drücke also in meiner VNC-Sitzung Strg+V. An die Textbox wird nun aber nicht "Strg+V" gesendet, sondern "Paste". Es wird also der Text "super Seite: www.mycsharp.de" in die Textbox eingefügt. Die Folge: Es wird an die Remoteseite Strg+S gesendet, da das S der erste Buchstabe des eingegebenen Textes ist.

=> Ich muss irgendwie alle Shortcuts der Textbox deaktivieren, sodass er, wenn ich Strg+V drücke, er in der Textbox ein v schreibt statt den Paste-Befehl durchzuführen.

Ich habe bereits folgenden XAML-Code gefunden und getestet:


        <TextBox Name="tbInput" TextChanged="tbInsert_TextChanged" Background="#00000000" Cursor="Cross">
            <TextBox.InputBindings>
                <KeyBinding Key="V" Modifiers="Control" Command="NotACommand" />
            </TextBox.InputBindings>
        </TextBox>

Hierdran stören mich zwei Sachen:
1. Man müsste für jede mögliche Kombination dieses Binding setzen
2. Das drücken von Strg+V funktioniert nun gar nicht mehr

Hat jemand noch eine andere Idee?

Wer Lust hat, kann sich den Code auch gerne angucken: http://beevnc.codeplex.com.

Viele Grüße!

Thema: Freie VNC-Library für .Net/C#?
Am im Forum: Rund um die Programmierung

Hi,

ich wollte zur Vollständigkeit einmal darauf hinweisen, dass ich mich tatsächlich an eine freie Umsetzung (BSD), basierend auf WPF, gemacht habe.
Zu finden unter https://beevnc.codeplex.com/
Der Entwicklungsstatus ist noch nicht abgeschlossen. Ich würde mal so auf ca. 50% schätzen. Derzeit funktioniert eine unkomprimierte Übertragung des Bildes und Tastatur. Maus geht noch nicht. Ebensowenig der Zwischenspeicher. Optimierungspotential gibt es auch noch bei der Performance und natürlich beim Code...

Thema: beRemote - Projekt: Remote Connection Manager
Am im Forum: Projekte

Hi,
also das es bei größeren Umgebungen ein Admin geben muss, ist soweit klar. Dieser muss dann die Tabellen anlegen oder ggf. Updates an den Tabellen durchführen. Das ist soweit auch so vorgesehen.

Aus meiner Erfahrung in den Unternehmen in denen ich gearbeitet habe kann ich aber sagen, dass die Hemmschwelle kleiner ist etwas bereits existierendes als "Server" zu verwenden (z.B. MSSQL) als etwas neues zu implementieren.
Zudem hat man bei den bestehenden Lösungen mit MSSQL, MySQL oder mit Sicherheit auch bei anderen Datenbanklösungen den Vorteil die Failover- und Hochverfügbarkeitsfeatures mitzubenutzen und nichts eigenes Implementieren zu müssen.

Ein "Problem" ist auch, dass wir noch ziemlich viel im Hinterkopf haben, was wir mit beRemote in etwas fernerer Zukunft alles machen wollen. Dabei werden dann jedoch erheblich mehr Datenmengen zusammenkommen als es jetzt noch der Fall ist.

Zuletzt ist es durch unsere Datenbankschnittstelle aber an sich möglich mit ein bisschen Programmierarbeit jede Datenbank dahinter zu benutzen. Mit dem nächsten Release werden wir das ganze aber auch Dokumentieren. Es ist dann also möglich je nach den eigenen Bedürfnissen die passende Datenbank zu benutzen. MSSQL und MySQL sind dabei halt die verbreitetsten.

Nichts desto trotz bin ich euch sehr dankbar für eure Anregungen. Wir werden die Alternativen zu unseren bisherigen Überlegungen einmal durchsprechen und abwägen ob wir unseren bisherigen Kurs beibehalten oder ob wir doch noch von der einen oder anderen Alternative überzeugt werden, von der wir vorher noch nichts gehört haben oder die bisher nicht in Betracht kam.

Thema: beRemote - Projekt: Remote Connection Manager
Am im Forum: Projekte

Hi,
ja, so groß ist sie nicht, dass ist korrekt. Aber SQLite unterstützt meines Wissens nach keine Stored Procedures. Daher muss z.T. einiges etwas aufwändig "zusammengesucht" werden, was bei MSSQL eine StoredProcedure mit entsprechender Performance machen würde.


Das mit den Netzlaufwerken KANN zu Problemen führen, muss es aber nicht - steht auch so in deinem ersten Link. Im produktiven Testbetrieb (gibt es sowas? :)) hatten wir zu dritt keine Probleme. Für größere Umgebungen wird es später ohnehin die größeren Datenbanken geben, wo das dann kein Problem mehr dastellt.

Die SQLite-DB ist primär für die Benutzung lokal gedacht. Netzlaufwerk ist zwar möglich, aber wie ich jetzt weiß, kann es problematisch werden.

Thema: beRemote - Projekt: Remote Connection Manager
Am im Forum: Projekte

Ja, er hat auch Recht. Das bestreite ich nicht. Ich habe aber auch geschrieben, dass die DB durchaus in Netzlaufwerken liegen kann/darf und dass man den Pfad anpassen kann sowie dass wir den Standardpfad ändern werden (siehe hier)

Thema: beRemote - Projekt: Remote Connection Manager
Am im Forum: Projekte

Prinzipiell gebe ich dir Recht. Andererseits kann die Datenbank aber auch von mehreren Benutzern von unterschiedlichen Rechnern gleichzeitig benutzt werden. Wir könnten den Default-Pfad für die SQLite-DB allerdings nach %appdata% das users legen.
Im Moment kann zur Anpassung des Pfades in der config.ini die Option dbpath angepasst werden.
Um die Datenbank woanders abzulegen, muss diese Option einfach angepasst werden. Z.B. dbpath=X:\beremote.db
Sollte das mit dem Release-Download nicht funktionieren, teste bitte einmal den aktuellsten Snapshot.

Für die Zukunft ist ohnehin zusätzlich zu der SQLite-Datebank noch die Möglichkeit der Nutzung einer MSSQL bzw. MySQL-Datenbank angedacht. Dies wird auch einige Performanceverbesserungen mit sich bringen.

Thema: beRemote - Projekt: Remote Connection Manager
Am im Forum: Projekte

Hi Pippl,

Zunächst zum Tracker: Du musst dich erst registrieren und anmelden, damit du im Bugtracker Bugs reporten kannst.

Zum Problem:
Wo liegt bei dir beRemote? ggf. in einem Netzlaufwerk?
Die Meldung wirkt so, als hättest du keine Rechte auf den Ordner in dem beRemote liegt. Dort wird aber die Datenbank-Datei angelegt.

Thema: beRemote - Projekt: Remote Connection Manager
Am im Forum: Projekte

Heute haben wir unser erstes PreRelease von beRemote veröffentlicht. Es ist das beRemote Release Preview 1. Ihr könnte es in der Download-Sektion auf www.beremote.net herunterladen oder ihr klickt den Download-Link im ersten Beitrag.
Es gibt noch einige bekannte und unbekannte Bugs. Ihr könnt diese in unserem Bugtracker verfolgen und melden. Der Bugtracker ist erreichbar unter https://tracker.beremote.net.
Zudem könnt ihr immer den letzten Snapshot von beRemote von unserer Website abrufen oder klick hier. Die Snapshots sind allerdings ungeprüft und können im schlimmsten Fall die Datenbank zerstören oder andere schwere Fehler beinhalten. Normalerweise passiert das natürlich nicht, aber man weiß ja nie...

Außerdem suchen wir noch weiterhin Entwickler, die das beRemote-Development-Team unterstützen möchten oder unter eigenem Namen Plugins entwickeln möchten. Wer Interesse hat, kontaktiert uns bitte über den "contact"-Link um unteren Ende der beRemote-Seite oder hier im Forum. Wir haben noch eine Menge vor!

Das Feature Request von m.knigge ist leider noch nicht implementiert, aber wird in Kürze umgesetzt.
Der Verlauf des Feature Requests kann hier verfolgt werden: https://tracker.beremote.net/issues/233

Thema: beRemote - Projekt: Remote Connection Manager
Am im Forum: Projekte

Zitat von m.knigge
Auf meinem Systtem aktiviere ich Launchy durch einen Hotkey, tippe dann "ssh" gefolgt von dem Hostnamen (der dem PuTTY bekannt sein muss), drücke einmal beherzt auf ENTER und schwupps öffnet sich PuTTY mit der Connection zum angegebenen Host.

Wäre es auch in Ordnung, wenn beRemote bereits läuft und du dann diesen Befehl eingibst? Dann wäre das Thema mit dem Login auch gegessen, da dieser zu dem Zeitpunkt dann ja schon erfolgt ist. In meiner täglichen Arbeit habe ich beRemote jedenfalls den ganzen Tag auf, einfach da ich eigentlich immer Remote irgendwo drauf bin. Daher könnte ich mir vorstellen, dass es bei dir auch so sein könnte.

Wir sind kurz vor dem ersten PreRelease - leider etwas hinter dem Zeitplan, aber besser als ein paar zu viele Bugs zu haben.
Wenn alles nach Plan läuft, gibt es Montag mehr ;)