Laden...
R
R3turnz myCSharp.de - Member
Süddeutschland Dabei seit 03.01.2016 125 Beiträge
Benutzerbeschreibung

Forenbeiträge von R3turnz Ingesamt 125 Beiträge

10.04.2017 - 20:43 Uhr

Hallo,
heute eine reinen Interessenfrage. Warum habt ihr euch entschieden, diese Seite in PHP zu schreiben? Bei einem C# Forum wäre ASP.NET doch die nahe liegende Wahl. Also woran saht ihr die Vorteile?

02.01.2017 - 10:45 Uhr

@MrSparkle

Was genau meinst du mit "fast ohne"? Entweder hast du Angaben gemacht, oder du hast die Default-Werte benutzt. Aber wie machst du "fast keine" Angaben?

Ich skaliere nur einige Icons und Bilder auf einheitliche Größen.

Hier der gekürzte Code:

<metro:MetroWindow
    x:Class="OpenWeather.GUI.Views.MainWindow"
    <!-- ... -->
    Title="{x:Static properties:Resources.Title}" MinHeight="750" Height="750" MinWidth="600" Width="600"
    RightWindowCommandsOverlayBehavior="HiddenTitleBar">
    <metro:MetroWindow.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVisibiltyConverter" />
        <converters:EnumLocalizationConverter x:Key="EnumLocalizationConverter" />
    </metro:MetroWindow.Resources>
    <!-- Flyouts und Event Bindings -->
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="3*" />
            <RowDefinition Height="3*" />
        </Grid.RowDefinitions>
        <ProgressBar IsIndeterminate="True"
                     Visibility="{Binding IsBusy, Converter={StaticResource BoolToVisibiltyConverter}}" Height="20" />
        <TextBlock DataContext="{Binding Location}" FontSize="20" Grid.Row="1">
            <TextBlock.Text>
                <MultiBinding StringFormat="{}{0},{1}" FallbackValue="-,-">
                    <Binding Path="City" FallbackValue="-" />
                    <Binding Path="Region.DisplayName" FallbackValue="-" />
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
        <DockPanel DataContext="{Binding CurrentWeather.Weather}" Grid.Row="2">
            <TextBlock DockPanel.Dock="Right" Text="{Binding TempUnit}"
                       Margin="10" />
            <TextBlock DockPanel.Dock="Left"
                       Text="{Binding Temperature, FallbackValue='-'}"
                       FontSize="30" />
        </DockPanel>
        <DockPanel Grid.Row="3">
            <Image DockPanel.Dock="Left" Source="{Binding CurrentWeather.Icon}" Height="75" Width="75"
                   Stretch="Uniform" />
            <TextBlock DockPanel.Dock="Right" DataContext="{Binding CurrentWeather.Weather}" TextAlignment="Left"
                       FontSize="20">
                <TextBlock.Text>
                    <MultiBinding StringFormat="{}{0} ({1})" FallbackValue="- (-)">
                        <Binding Path="Condition" Converter="{StaticResource EnumLocalizationConverter}" />
                        <Binding Path="Description" />
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DockPanel>
        <Grid DataContext="{Binding SunCycle}" Grid.Row="4">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                <Path Fill="Black" Height="25" Width="25"
                      Data="" />
                <TextBlock Text="{x:Static properties:Resources.Sunrise}" />
            </StackPanel>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Grid.Column="1">
                <Path Fill="Black" Height="25" Width="25"
                      Data="" />
                <TextBlock Text="{x:Static properties:Resources.Sunset}" />
            </StackPanel>
            <TextBlock Text="{Binding Sunrise.TimeOfDay}" Grid.Row="1" />
            <TextBlock Text="{Binding Sunset.TimeOfDay}" Grid.Row="1" Grid.Column="1" />
        </Grid>
        <Grid DataContext="{Binding CurrentWeather.Weather}" Grid.Row="5">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                <Path Fill="" />
                <TextBlock Text="{x:Static properties:Resources.Humidity}" />
            </StackPanel>

            <TextBlock Grid.Row="1" Text="{Binding Humidity, FallbackValue='-', StringFormat={}{0} %}" FontSize="20" />
            <TextBlock Grid.Column="1" Text="{x:Static properties:Resources.Pressure}" />
            <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Pressure,FallbackValue='-', StringFormat={}{0} hPa}"
                       FontSize="20" />
            <StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Center">
                <Path Fill="Black" Height="25" Width="25"
                      Data="" />
                <TextBlock Text="{x:Static properties:Resources.WindSpeed}" />
            </StackPanel>
            <TextBlock Grid.Column="2" Grid.Row="1"
                       Text="{Binding WindSpeed,FallbackValue='-', StringFormat={}{0} meter/sec}" FontSize="20" />
        </Grid>
        <ListBox ItemsSource="{Binding DailyForecast}"
                 SelectedItem="{Binding SelectedForecastDay, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"
                 Grid.Row="6">
        <!-- ... -->
        </ListBox>
        <ListBox ItemsSource="{Binding HourlyForecastAtSelectedDay}" Grid.Row="7">
        <!-- ... -->
        </ListBox>
    </Grid>
</metro:MetroWindow>

01.01.2017 - 22:26 Uhr

Hallo,
das Fenster ist ohne Canvas und fast ohne explizite Angaben von Width und Height erstellt. Auf einem größeren Bildschirm ist auch alles wie gewollt angezeigt, auf einem kleinen Notebook wird aber ein Teil abgeschnitten. Bisher dachte ich WPF ist Auflösungsunabhänig. Die eingestellte Mindestgröße müsste doch auf dem kleinen Bildschirm herunterskaliert werden... Wieso kann das nicht so sein?

19.12.2016 - 19:31 Uhr

Hallo,
ich möchte ein Neuladen-Symbol zeichnen, habe schon den Bogen und muss nun noch ein Dreieck an das obere Ende des ArcSegment anhängen:


                        <Path Stroke="Black" HorizontalAlignment="Center">
                            <Path.Data>
                                <PathGeometry>
                                    <PathFigure StartPoint="0,20">
                                        <PathFigure.Segments>
                                            <ArcSegment Point="0,10" Size="10,10" SweepDirection="CounterClockwise" IsLargeArc="True"/>
                                        </PathFigure.Segments>
                                    </PathFigure>
                                </PathGeometry>
                            </Path.Data>
                        </Path>

Wie kann ich ein soetwas zeichnen?

12.12.2016 - 19:58 Uhr

Hallo,
ich wollte das Kompilieren, Kopieren von Datein usw. automatisieren. Ich habe dafür ein Bash-Script geschrieben, finde aber für C# garnichts an dem ich mich orientieren könnte. Was müsste das Script neben xbuild noch alles ausführen? Wie kann ich zum Beispiel Nugetpackete installieren?

09.12.2016 - 23:16 Uhr

Version 1.4 veröffentlicht

Änderungen
-Automatische Aktualisierung des Wetters beim Start
-About-Fenster mit Lizenzen der verwendeten Open Source Bibliotheken
-Fehlerbehebungen und kleinere Verbesserungen

Download
Kann auf der "Projektseite" heruntergeladen werden.

Das Projekt ist nun auf dem Desktop und in der Konsole komplett. Ich werde das Projekt wahrscheinlich auch noch auf Android portieren.

09.12.2016 - 15:29 Uhr

Nach längerem bin ich auf folgende Lösung gekommen: (Dafür muss das Icon als Ressource kompiliert werden)


       <Image Source="pack://application:,,,/Properties/Application.ico"/>

08.12.2016 - 19:07 Uhr

Hallo,
ich möchte an das Assembly-Icon. nicht das Window-Icon, als Image anzeigen. Wie lässt sich das umsetzen?

12.11.2016 - 20:02 Uhr

Danke, es sieht auf jeden Fall übersichtlicher aus. Gibt es eine Möglichkeit so auch Json Arrays zu erstellen?

11.11.2016 - 21:21 Uhr

Hallo,
ich habe simplere Parsing-Methoden immer mit Linq to Json getestet:


        public static IEnumerable<object[]> LocationResponsesWithInvalidRegion
        {
            get
            {
                yield return new object[] { new JObject(new JProperty("name", "Stuttgart"), new JProperty("country", "dee")).ToString() };
                yield return new object[] { new JObject(new JProperty("name", "New York"), new JProperty("country", "uss")).ToString() };
            }
        }

Ich finde es wesentlich übersichtlicher als Json direkt mit Text zu übergeben und auch das escapen der Anführungszeichen fällt weg. Bei einer Methode, die komplexeres Json verarbeitet, wäre es ein viel komplizierterer Aufbau. Außerdem bräuchte ich IEquatbable nur für die Unit-Tests. Gibt es eine Möglichkeit das einfacher zu testen oder lohnt sich dieser Aufwand?

05.11.2016 - 18:03 Uhr

Hallo,
wenn das Parsen fehlschlägt wird in einer Klassenbibliothek eine JsonException geworfen geworfen. Diese möchte ich nun in der Oberfläche abfangen, hier referenziere ich Json.Net aber garnicht. Sollte ich hier in eine andere Exception wrappen, oder einfach den Verweis hinzufügen? Und wenn ja in welche?

04.11.2016 - 08:55 Uhr

Hallo,
ich möchte einen Einstellungsbutton erstellen, der ein neues View öffnet, welches das aktuelle Fenster überdeckt und eben nicht ein neues Fenster öffnet. Hierfür würde dann auch ein eigenes Viewmodel Sinn machen. Wie könnte ich das umsetzen?

31.10.2016 - 08:45 Uhr

Danke! Ich verstehe, dass ich IHTTPService für Mocking brauche, aber wieso IWeatherRepository?

30.10.2016 - 18:09 Uhr

Ich will folgende Klasse testen:


    public class WeatherQuery
    {
        #region fields
...
        #endregion
        #region enums
        public enum RequestType { Weather, Forecast}
        #endregion
        #region constructors
...
        #endregion
        #region methods
        private string GetWeather(RequestType requestType, NameValueCollection parameters)
        {
            using (var client = new WebClient())
            {
                return client.DownloadString(BuildQueryURL("data/2.5/" + requestType.ToString().ToLower(),UpdateParameters(parameters)));
            } 
        }
        private async Task<string> GetWeatherAsync(RequestType requestType, NameValueCollection parameters)
        {
...
        }
        public string GetWeather(RequestType requestType, string city, string countryCode)
        {
            return GetWeather(requestType, new NameValueCollection() { { "q", CombineQueryCountryCode(city,countryCode) } });
        }
        public string GetWeather(RequestType requestType, double latitude, double longitude)
        {
            return GetWeather(requestType, new NameValueCollection() { { "lat", latitude.ToString(CultureInfo.InvariantCulture) }, { "lon", longitude.ToString(CultureInfo.InvariantCulture) } });
        }

        public async Task<string> GetWeatherAsync(RequestType requestType, string city, string countryCode)
        {
...
        }
        public async Task<string> GetWeatherAsync(RequestType requestType, double latitude, double longitude)
        {
...
        }
        public byte[] GetIcon(string iconIdentifier)
        {
            using (var client = new WebClient())
            {
                return client.DownloadData(BuildQueryURL("img/w/",null));
            }
        }
        public async Task<byte[]> GetIconAsync(string iconIdentifier)
        {
            using (var client = new WebClient())
            {
                return await client.DownloadDataTaskAsync(BuildQueryURL("img/w/" + iconIdentifier,null));
            }   
        }
        private Uri BuildQueryURL(string relativePath, NameValueCollection parameters)
        {
            if (parameters == null) parameters = new NameValueCollection();
            //build uri//
            var builder = new UriBuilder(_scheme, _host);
            builder.Query = string.Join("&", parameters.AllKeys.Select((name) => string.Format("{0}={1}", HttpUtility.UrlEncode(name), HttpUtility.UrlEncode(parameters[name]))));
            return builder.Uri;
        }
        private NameValueCollection UpdateParameters(NameValueCollection parameters)
        {
...
        }
        private string CombineQueryCountryCode(string query, string countryCode)
        {
            return !string.IsNullOrEmpty(countryCode) ? query + "," + countryCode : query;
        }
        #endregion
    }

Mir sind schon zwei Tests eingefallen, die ich gerade aber nicht umsetzten kann:
-Obwohl es Sinn macht Methode BuildQueryURL zu testen, macht es keinen Sinn sie public zu machen.
-Ich müsste in jeder Methode ein WebClient übergeben, um auch ein Mockobjekt verwenden zu können. Gibt es eine elegantere Lösung?

Welche Tests wären sonst noch sinnvoll?

30.10.2016 - 17:45 Uhr

Okay, ich habe bisher noch nicht viel mit Mocking gemacht. Werde dann einfach entscheiden ob es für mich Sinn macht. Inwiefern setzt du dann soetwas um, da es kein Setup-Attribut gibt?

30.10.2016 - 17:08 Uhr

Ich verwende wie oben erwähnt xUnit und hier wird der und nicht die mit Setup markierte Methode sondern der Konstruktor vor jedem Test ausgeführt (Siehe Vergleich von Unit-Testing Frameworks)

30.10.2016 - 10:36 Uhr

Hallo,
ich habe nun angefangen mich mit Unit-Tests zu beschäftigen. Ich verwende xUnit und Autofixture. Hier sind meine ersten Tests:


//WeatherTests.cs//
        private Weather _dummyWeather = new Weather();
        [Theory,InlineData(-1),InlineData(101)]
        public void Humidity_InvalidValues_ExceptionThrown(double invalidHumidity)
        {
            Assert.Throws<ArgumentException>(() => _dummyWeather.Humidity = invalidHumidity);
        }
        [Theory,AutoData]
        public void TempUnit_TemperatureConvertation_TemperatureCalculated(double temperature, TemperatureUnit targetUnit)
        {
            var unit = _dummyWeather.TempUnit;
            _dummyWeather.Temperature = temperature;
            _dummyWeather.MaxTemperature = temperature;
            _dummyWeather.MinTemperature = temperature;
            _dummyWeather.TempUnit = targetUnit;
            Assert.Equal(_dummyWeather.Temperature, TemperatureUnitHelper.ConvertTemperature(unit, targetUnit, temperature),1);
            Assert.Equal(_dummyWeather.MaxTemperature, TemperatureUnitHelper.ConvertTemperature(unit, targetUnit, temperature), 1);
            Assert.Equal(_dummyWeather.MinTemperature, TemperatureUnitHelper.ConvertTemperature(unit, targetUnit, temperature), 1);    
        }
//TemperatureUnitHelperTest.cs//
        [Theory]
        [InlineData(-20,-4,253.15),InlineData(0,32,273.15),InlineData(20,68,293.15)]
        public void ConvertTemperature_CelsiusTemps_Calculated(double celsius, double expectedFahrenheit, double expectedKelvin)
        {
            Assert.Equal(expectedFahrenheit, TemperatureUnitHelper.ConvertTemperature(TemperatureUnit.Celsius, TemperatureUnit.Fahrenheit, celsius),2);
            Assert.Equal(expectedKelvin, TemperatureUnitHelper.ConvertTemperature(TemperatureUnit.Celsius, TemperatureUnit.Kelvin,celsius),2);
        }
        [Theory]
        [InlineData(250,-23.15, -9.67), InlineData(275, 1.85, 35.33),InlineData(300, 26.85, 80.33)]
        public void ConvertTemperature_KelvinTemps_Calculated(double kelvin, double expectedCelsius, double expectedFahrenheit)
...
        [Theory]
        [InlineData(-20, -28.89, 244.26),InlineData(0, -17.78, 255.37),InlineData(20, -6.67, 266.48)]
        public void ConvertTemperature_FahrenheitTemps_Calculated(double fahrenheit, double expectedCelsius, double expectedKelvin)

Das sind noch relativ simple Tests ohne Mocking etc. Gibt es trotzdem Verbesserungsmöglichkeiten?

23.10.2016 - 09:40 Uhr

Hallo,
ich habe endlich geschafft eine Textbox korrekt an eine Zahl zu binden.
Bei einem OneWayToSource-Binding funktioniert also alles einwandfrei. Bei einem TwoWay-Binding gibt es folgendes Problem:
Zum Beispiel "123," wird in "123" konvertiert und wird dann folgendermaßen auch übernommen. Ist es möglich dies zu ändern?

22.10.2016 - 08:30 Uhr

Es geht um Integer statt String. Habe gerade nochmal nachgeprüft und XML-Fehler treten beim Laden auf.

20.10.2016 - 15:11 Uhr

Hallo,
wenn ich einen ungültigen Wert in user.config angebe wird eine ConfgurationExeception geworfen. Ich habe schon versucht die Exception beim Laden der Konfiguration zu behandeln. Mir ist jetzt aber aufgefallen dass erst beim Zugreifen auf die betroffene Eigenschaft geworfen wird. Wie kann ich überprüfen ob ungültige Werte dabei sind?

19.10.2016 - 20:52 Uhr

Version 1.3 veröffentlicht

Änderungen
-Aktueller Ort wird nun wieder angezeigt
-3 stündliche Wettervorhersage
-Fehlerbehebungen und kleinere Verbesserungen

Download
Kann auf der "Projektseite" heruntergeladen werden.

16.10.2016 - 19:40 Uhr

Ich würde nicht sagen dass ich es im Schlaf singen kann, aber es ist mir nicht unvertraut. Das war eigentlich der komplette Sourcecode, den ich für wichtig finde. Dazwischen liegt in diesem Fall eigentlich nur eine weitere Methode:


public class Query : IDisposable
{
...
        protected readonly WebClient _client;
        protected async Task<Tuple<bool, byte[]>> DownloadDataAsync(Uri queryURI)
        {
            bool success = true;
            byte[] queryResponse = null;
            var query = new TaskCompletionSource<byte[]>();
            DownloadDataCompletedEventHandler downloadCompleted = (sender, e) => {
                if (e.Error != null)
                    query.SetException(e.Error);
                else
                    query.SetResult(e.Result);
            };
            _client.DownloadDataCompleted += downloadCompleted;
            _client.DownloadDataAsync(queryURI);
            try
            {
                queryResponse = await query.Task;
            }
            catch (WebException)
            {
                success = false;
            }
            _client.DownloadDataCompleted -= downloadCompleted;
            return new Tuple<bool, byte[]>(success, queryResponse);
        }
....
}
public class WeatherQuery : Query,IDisposable
    {
        public async Task<Tuple<bool,byte[]>> TryGetIconAsync(string iconIdentifier)
        {
            return await DownloadDataAsync(BuildWeatherQueryURL("img/w/" + iconIdentifier, null, false));
        }
    }

Bei der normalen Wetterabfrage verwende ich statt dem bool ein Enum, welches dann in eine Fehlermeldung konvertiert wird:


        public enum RequestStatus { OK, InvalidCity, InvalidKey, Failed, UnkownError }

Für mich ist es ein akzeptieble genau Meldung und ich muss die Exception nicht an zwei Stellen mit dem gleichen Code fangen und dort wird es doch ein gutes Stück lesbarer.
Bei den Icons kann ja nur die Verbindung nicht funktionieren.

16.10.2016 - 15:49 Uhr

Hallo,
ich habe eine Methode, die bytes asynchron herunterlädt:


        protected async Task<Tuple<bool, byte[]>> DownloadDataAsync(Uri queryURI)
        {
            bool success = true;
            byte[] queryResponse = null;
            var query = new TaskCompletionSource<byte[]>();
            DownloadDataCompletedEventHandler downloadCompleted = (sender, e) => {
                if (e.Error != null)
                    query.SetException(e.Error);
                else
                    query.SetResult(e.Result);
            };
            _client.DownloadDataCompleted += downloadCompleted;
            _client.DownloadDataAsync(queryURI);
            try
            {
                queryResponse = await query.Task;
            }
            catch (WebException)
            {
                success = false;
            }
            _client.DownloadDataCompleted -= downloadCompleted;
            return new Tuple<bool, byte[]>(success, queryResponse);
        }

Wenn ich jetzt in einer Schleife die Methode Aufrufe wird folgende Exception geworfen.


                Forecast = await Task.WhenAll(WeatherParser.ParseForecast(forecastResponse.Item2, Settings.TempUnit).Select(async (forecastAtDay) =>
                {
                    var forecastIcon = await weatherQuery.TryGetIconAsync(forecastAtDay.IconIdentifier);
                    return new WeatherIconWrapper(forecastAtDay, forecastIcon.Item1 ? LoadImage(forecastIcon.Item2) : null);
                }
                ));

Fehlermeldung:
System.InvalidOperationException wurde nicht behandelt.
HResult=-2146233079
Message=Es wurde versucht, eine Aufgabe in einen finalen Zustand zu versetzen, als sie bereits abgeschlossen war.
Source=mscorlib
StackTrace:
bei System.Threading.Tasks.TaskCompletionSource`1.SetResult(TResult result)
bei OpenWeather.DataClient.Query.<>c__DisplayClass2_0.<DownloadDataAsync>b__0(Object sender, DownloadDataCompletedEventArgs e) in Query.cs:Zeile 33.
bei System.Net.DownloadDataCompletedEventHandler.Invoke(Object sender, DownloadDataCompletedEventArgs e)
bei System.Net.WebClient.OnDownloadDataCompleted(DownloadDataCompletedEventArgs e)
bei System.Net.WebClient.DownloadDataOperationCompleted(Object arg)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
bei System.Windows.Threading.DispatcherOperation.InvokeImpl()
bei System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Windows.Threading.DispatcherOperation.Invoke()
bei System.Windows.Threading.Dispatcher.ProcessQueue()
bei System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
bei System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
bei MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
bei MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
bei System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
bei System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
bei System.Windows.Application.RunDispatcher(Object ignore)
bei System.Windows.Application.RunInternal(Window window)
bei System.Windows.Application.Run(Window window)
bei System.Windows.Application.Run()
bei OpenWeather.GUI.App.Main() in \App.g.cs:Zeile 0.
bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
InnerException:

So weit wie ich das verstehe wird die Methode aus einem anderen Thread schon aufgerufen bevor diese Methode überhaupt beendet wurde. Hier dürfte also nur ein Thread auf die Methode zugreifen. Ist soetwas mit async/await überhaupt möglich oder sehe ich den Fehler an der falschen Stelle?

16.10.2016 - 08:06 Uhr

Hallo,
Ich versuche eine Liste von Objekten mit einer asynchronen Operation zu konvertieren:


                Forecast = WeatherParser.ParseForecast(forecastResponse.Item2, Settings.TempUnit).Select(async (forecastAtDay) =>
                 {
                     var forecastIcon = await weatherQuery.TryGetIconAsync(forecastAtDay.IconIdentifier);
                     return new WeatherIconWrapper(forecastAtDay, forecastIcon.Item1 ? LoadImage(forecastIcon.Item2) : null);
                 }
                );

Hier wird statt der Liste von Objekten, jedoch eine von Tasks zurückgegeben. Wie kann ich auf diese "warten"?

15.10.2016 - 12:25 Uhr

Hallo,
ich habe ein Liste mit Objekten und eine mit Icons. Ich kann ja nur eine an eine ListView binden. Da das Objekt Mono kompatibel sein sollte und das BitmapImage auch erst im ViewModel und nicht während der eigentlichen Erstellung des Objekts hinzugefügt wird, kommt eine Eigenschaft eher nicht in Frage. Folgende Optionen sind mir eingefallen:
-Verwenden eines Tuples
-Eine Wrapperklasse
-Von Weather ableiten und Eigenschaft hinzufügen
Welche sollte ich verwenden, oder wie führe ich Listen mit verschiedenen Typen am besten zusammen?

14.10.2016 - 20:04 Uhr

Version 1.0 veröffentlicht

Änderungen
-Schönere Oberfläche
-Wetterkonditon wird auf Desktop angezeigt

Download
Projekt auf GitHub

Ich habe das Projekt komplett neu aufgesetzt, da ich git schlecht bis überhaupt nicht verwendet habe. Für jetzt ist es auch beendet, die fehlende Features werde ich je nach Motivation noch implementieren.

10.10.2016 - 18:21 Uhr

Ich habe mir den Usercontrol aus Th69 kopiert, und wollte nun meinen Textblock platizieren:


                <local:PercentagePresentator Grid.Row="1" StrokeThickness="10" SegmentColor="Aquamarine" Percentage="{Binding CurrentWeather.Humidity}" HorizontalAlignment="Center" Radius="25">
                    <TextBlock TextAlignment="Center" Text="{Binding CurrentWeather.Humidity, FallbackValue='-', StringFormat={}{0} %}"/>
                </local:PercentagePresentator>

Nur wird nun statt dem Kreis nur der Text angezeigt. Wie kann ich das ändern?

09.10.2016 - 08:57 Uhr

Hallo,
ich möchte eine Prozentzahl ansprechend anzeigen. Dafür habe ich mich von der vorinstallieren Wetterapp inspieren lassen. Hier werden Prozentzahlen in einem Kreis um die Zahl dargestellt. (Siehe Anhang) Wie realsiere ich soetwas?

08.10.2016 - 16:40 Uhr

Version 0.6 veröffentlicht

Änderungen
-Wettervorhersage wird nun in Durschnittswerten in der Konsolenanwendung angezeigt
-Erste Schritte für Vorhersagen im Desktopprogramm
-Optimierungen

Download
Projekt auf GitHub

05.10.2016 - 16:26 Uhr

Ersteinmal Danke für die Antworten!
@LaTino Ich habe bisher deseralisert, dass hat aber ein größeres Klassenkonstrukt erzeugt, in denen manche nur eine Eigenschaft hatten.
Dies ist mein verbesserter Converter:


    public static class WeatherParser
    {
        #region fields
        private const string climaticDataName = "main";
        private const string conditionName = "weather";
        private const string temperatureName = "temp";
        private const string minTemperatureName = "temp_min";
        private const string maxTemperatureName = "temp_max";
        #endregion
        #region methods
        private static DateTime UnixTimeToDateTime(string text) { ... }
        public static Tuple<string,string> ParseLocation(string queryResponse) { ... }
        public static Weather ParseCurrentWeather(string queryResponse, TemperatureUnit unit) { ... }
        #region forecast
        public static IDictionary<DateTime,Weather> ParseForecast(string queryResponse,TemperatureUnit unit)
        {
            var weatherPointsAtDays = GetTimePointsAtDay(queryResponse);
            return weatherPointsAtDays.Select(weatherPointsAtDay => new
            {
                Date = weatherPointsAtDay.Key,
                Weather = new Weather()
                {
                    Condition = GetConditionAtDay(weatherPointsAtDay),
                    Temperature = weatherPointsAtDay.Average(weatherPoint => weatherPoint[climaticDataName].Value<double>(temperatureName)),
                    MinTemperature = weatherPointsAtDay.Min(weatherPoint => weatherPoint[climaticDataName].Value<double>(temperatureName)),
                    MaxTemperature = weatherPointsAtDay.Max(weatherPoint => weatherPoint[climaticDataName].Value<double>(temperatureName)),
                    Humidity = weatherPointsAtDay.Average(weatherPoint => weatherPoint[climaticDataName].Value<double>())
                }
            }
            ).ToDictionary((weatherAtDay) => weatherAtDay.Date, (weatherAtDay) => weatherAtDay.Weather);
        }
        private static WeatherCondition GetConditionAtDay(IEnumerable<JToken> weatherPointsAtDay)
        {
            var weatherConditions = Enum.GetValues(typeof(WeatherCondition)).Cast<WeatherCondition>();
            return weatherConditions.OrderBy((condition) => weatherPointsAtDay.Count((timePoint) => ((WeatherCondition)Enum.Parse(typeof(WeatherCondition), timePoint[condition].First.Value<string>("main"))) == condition)).Last();
        }
        private static string GetConditionDescriptionAtDay(IEnumerable<JToken> weatherPointsAtDay)
        {
            var descriptions = weatherPointsAtDay.Select(weatherPoint => weatherPoint[conditionName].Value<string>("description")).Distinct();
            return descriptions.OrderBy(description => weatherPointsAtDay.Count((weatherPoint) => weatherPoint[conditionName].Value<string>("description") == description)).Last();
        }
        private static IEnumerable<IGrouping<DateTime, JToken>> GetTimePointsAtDay(string queryResponse)
        {
            return JObject.Parse(queryResponse)["list"].GroupBy((timePoint) => (UnixTimeToDateTime(timePoint.Value<string>("dt"))).Date);
        }
        #endregion
        #endregion
    }

04.10.2016 - 20:18 Uhr

Hallo,
das hier ist der bisherige Code einer Parser-Methode:


            var weatherPointsAtDays = JObject.Parse(queryResponse)["list"].GroupBy((timePoint) => (UnixTimeToDateTime(timePoint.Value<string>("dt"))).Date);
            weatherPointsAtDays.Select(weatherPointsAtDay =>
            {
                Weather weatherAtDay = new Weather();
                weatherAtDay.Condition = (WeatherCondition)Enum.Parse(typeof(WeatherCondition), weatherPointsAtDay.OrderBy((timePoint) => weatherPointsAtDay.Count(tP => timePoint["weather"].First.Value<string>("main") == tP["weather"].First.Value<string>("main"))).Last()["weather"].Value<string>("main"));
                weatherAtDay.Temperature = weatherPointsAtDay.Average(timePoint => timePoint["main"].Value<double>("temp"));
                weatherAtDay.MinTemperature = weatherPointsAtDay.Min(timePoint => timePoint["main"].Value<double>("temp"));
                weatherAtDay.MaxTemperature = weatherPointsAtDay.Max(timePoint => timePoint["main"].Value<double>("temp"));
                weatherAtDay.TempUnit = unit;
                return weatherAtDay;
            }
            );

Ich erhalte 3-stündige Wettervorhersagen und möchte aber mit jedem Objekt einen ganzen Tag darstellen.
Ich bin ziemlich unzufrieden mit der Lesbarkeit und der Übersicht. Wo könnte ich da etwas ändern?

30.09.2016 - 20:54 Uhr

Hallo,

nach dem ich mich jetzt doch schon länger mit Programmieren beschäftige, kann ich jetzt zum ersten mal ein Projekt vorstellen. Es ist bei weitem nicht perfekt und ich bin auch noch nicht fertig. Trotzdem würde ich mich über Feedback freuen.

Features
-Wettervorhersage (Aktuell nur in der Konsole)
-Automatische Lokalisierung
-Orte können auch per Koordinaten angegeben werden
-Mehrere Einheiten unterstützt (Celsius,Fahrenheit,Kelvin)

Mit der Konsolenversion bin ich eigentlich sehr zufrieden, während die Desktop-Version noch sehr verbesserungswürdig ist. Mir ist auch bewusst, dass es viele bessere Alternativen gibt.

Download
Projekt auf GitHub

28.09.2016 - 15:57 Uhr

Ich habe gerade ein wenig herumprobiert und bin auf eine doch sehr naheliegende Lösung gekommen. Das Configuration Objekt, welches zum Speichern und Laden verwendet wird muss das gleiche sein, dann werden auch die Werte synchronisiert:


private static readonly Configuration _config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
Settings = _config.GetSection("Settings") as SettingsSection ?? new SettingsSection();
        private void SaveSettings()
        {
            Settings.SectionInformation.AllowExeDefinition = ConfigurationAllowExeDefinition.MachineToLocalUser;
            if (_config.Sections["Settings"] == null) _config.Sections.Add("Settings", Settings);
            _config.Save(ConfigurationSaveMode.Full);
        }

Die GetSection Methode in der ConfigurationSection zu impelementieren, ist also nur für den lesenden Zugriff geeignet:


        public static SettingsSection GetSection()
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
            return config.GetSection("Settings") as SettingsSection ?? new SettingsSection();   
        }

(@Coffebean Settings ist eine Eigenschaft, die per Datenbindung editiert wird)

28.09.2016 - 15:01 Uhr

Hier der komplette Quellcode:


 class SettingsSection : ConfigurationSection, INotifyPropertyChanged
    {
        #region fields
        static ConfigurationPropertyCollection _properties;
        static ConfigurationProperty _location;
        static ConfigurationProperty _tempUnit;
        #endregion
        #region constructors
        static SettingsSection()
        {
            _properties = new ConfigurationPropertyCollection();
            _location = new ConfigurationProperty("Location", typeof(LocationElement), new LocationElement());
            _tempUnit = new ConfigurationProperty("unit", typeof(ClimaticData.TemperatureUnit));
            _properties.Add(_location);
            _properties.Add(_tempUnit);
        }
        #endregion
        #region properties
        public LocationElement Location
        {
            get
            {
                return base[_location] as LocationElement;
            }
            set
            {
                base[_location] = value;
                OnPropertyChanged(nameof(Location));
            }
        }
        public ClimaticData.TemperatureUnit TempUnit
        {
            get
            {
                return (ClimaticData.TemperatureUnit)base[_tempUnit];
            }
            set
            {
                base[_tempUnit] = value;
                OnPropertyChanged(nameof(TempUnit));
            }
        }
        protected override ConfigurationPropertyCollection Properties
        {
            get { return _properties; }
        }
        #endregion
        #region INotifyPropertyChanged members
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
        #region methods
        public static SettingsSection GetSection()
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
            return config.GetSection("Settings") as SettingsSection ?? new SettingsSection();   
        }
        #endregion
    }
    class LocationElement : ConfigurationElement, IDataErrorInfo, INotifyPropertyChanged
    {
        [ConfigurationProperty("city")]
        public string City
        {
            get
            {
                return base["city"] as string;
            }
            set
            {
                base["city"] = value;
                OnPropertyChanged(nameof(City));
            }
        }
        [ConfigurationProperty("country")]
        public string CountryCode
        {
            get
            {
                return base["country"] as string;
            }
            set
            {
                base["country"] = value;
                OnPropertyChanged(nameof(CountryCode));
            }
        }
        [ConfigurationProperty("latitude")]
        public double Latitude
        {
            get
            {
                return (double)base["latitude"];
            }
            set
            {
                base["latitude"] = value;
                OnPropertyChanged(nameof(Latitude));
            }
        }
        [ConfigurationProperty("longitude")]
        public double Longitude
        {
            get
            {
                return (double)base["longitude"];
            }
            set
            {
                base["longitude"] = value;
                OnPropertyChanged(nameof(Longitude));
            }
        }
        #region IDataErrorInfo members
        public new string this[string columnName]
        {
            get
            {
                string error = string.Empty;
                if (columnName == nameof(City))
                {
                    if (string.IsNullOrEmpty(City)) error = "City cannot be empty!";
                }
                else if (columnName == nameof(Latitude))
                {
                    if (!IsValidCoordinate(Latitude)) error = "The coordinate is out of range!";
                }
                else if (columnName == nameof(Longitude))
                {
                    if (!IsValidCoordinate(Longitude)) error = "The coordinate is out of range!";
                }
                return error;
            }
        }
        public string Error
        {
            get { throw new NotImplementedException(); }
        }
        #region INotifyPropertyChanged members
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
        #endregion
        #region private methods
        private bool IsValidCoordinate(double coordinate)
        {
            return coordinate >= -180 && coordinate <= 180;
        }
        #endregion
        #region methods
        public bool IsValidColumn(string columnName)
        {
            return string.IsNullOrEmpty(this[columnName]);
        }
        #endregion
    }

Code zum Speichern und Laden:


        public static SettingsSection GetSection()
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
            return config.GetSection("Settings") as SettingsSection ?? new SettingsSection();   
        }
             private void SaveSettings()
            {   
                var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
                Settings.SectionInformation.AllowExeDefinition = ConfigurationAllowExeDefinition.MachineToLocalUser;
                if (config.Sections["Settings"] == null) config.Sections.Add("Settings", Settings);
                config.Save(ConfigurationSaveMode.Full);
                ConfigurationManager.RefreshSection("Settings");
            }

Ich habe Sir Rufos Vermuting im Debugger überprüft und tatsächlich werden die Werte nicht synchronisiert. Der Indexer der Sections Collection ist aber schreibgeschützt, wie sind diese synchronisieren? (@Coffebean Ich gehe davon aus, dass du RefreshSection meinst? Ändert leider nichts)

27.09.2016 - 18:53 Uhr

Ich verstehe dich nicht ganz, ich habe die Eigenschaft doch schon gesetzt. Ich öffnemit PerRoaming und dafür wird doch nur eigentlich diese Option gedacht. Aber auch dein Vorschlag führt ändert nichts an dem Fehler.

27.09.2016 - 18:17 Uhr

Wenn ich den ConfigurationUserLevel auf PerUserRoaming setze wird folgende Exception geworfen:> Fehlermeldung:

InnerException:
HResult=-2146233079
Message=Die ConfigurationSection-Eigenschaften können nicht bearbeitet werden, wenn sie gesperrt sind.
Source=System.Configuration
StackTrace:
bei System.Configuration.SectionInformation.VerifyIsEditable()
bei System.Configuration.SectionInformation.set_AllowExeDefinition(ConfigurationAllowExeDefinition value)
bei OpenWeather.GUI.ViewModel.SaveSettings() in ...\ViewModel.cs:Zeile 153.

Kurzes googeln hat ergeben, dass ich folgende Eigenschaft setzen muss:


Settings.SectionInformation.AllowExeDefinition = ConfigurationAllowExeDefinition.MachineToRoamingUser;

Dies führt zur gleichen Exception, jetzt aber beim setzen der Eigenschaft.

27.09.2016 - 15:42 Uhr

Hallo,
ich verwende diese Methode um auf eine Section zuzugreifen:


        public static SettingsSection GetSection()
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            return config.GetSection("Settings") as SettingsSection ?? new SettingsSection();   
        }

Beim Schließen des Fensters wird dann folgende Methode zum Speichern verwendet:


        private void SaveSettings()
        {   
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            if (config.Sections["Settings"] == null) config.Sections.Add("Settings", Settings);
            config.Save(ConfigurationSaveMode.Full);
        }

Das erste Speichern und Laden klappt ohne Probleme. Wenn ich die Section jedoch lade und ändere, wird nichts neues geschrieben, sondern die alten Werte bleiben einfach bestehen. Woran kann das liegen?

22.09.2016 - 20:02 Uhr

Nochmal zur Klarstellung:
Ich finde die System.Configuration zu komplex und es gibt meiner Meinung nach bessere Alternativen. (z.B. WestWind Configuration) Mit der built-in Variante ist es möglich mit der Ableitung von ConfigurationSection verschachtelte Elemente in der .config Datei zu verwenden. Alle alternativen Frameworks geben an es können nur Key-Value Paare in der .config Datei gespeichert werden:


<CustomConfigFileConfiguration>
   <add key="ApplicationName" value="Configuration Tests" />   
   <add key="ServerList1" value="DevServer" />
   <add key="ServerList2" value="Maximus" />
   <add key="ServerList3" value="Tempest" />
</CustomConfigFileConfiguration>

Nun zur Frage:
Gibt es irgendeinen Grund bei .config zu bleiben oder kann ich direkt eine andere verwenden?

22.09.2016 - 18:03 Uhr

Hallo,
Ich bin auf der Suche nach einer Alternative zu dem Viel zu komplexen System.Configuration Namespace. Alles was ich bisher gefunden habe ermöglicht in der .config Datei nur Key Value Paare, während es mit System.Configuration möglich ist verschachtelte Elemente darzustellen. Soll ich die .config Datei überhaupt noch verwenden oder ist der Nachteil verkraftbar?

14.09.2016 - 14:17 Uhr

Ich habe gerade nocheinmal nachgedacht und eine "Notlösung" gefunden:
Die HasErrors Property wird an eine Eigenschaft im ViewModel gebunden. Dies löst zwar das Problem, endet aber in sehr viel gleichem Code. Kennt jemand eine bessere Lösung?

13.09.2016 - 20:28 Uhr

Ich möchte ein Command nur ausführen wenn die Validierung nicht fehlgeschlagen ist. Ich habe eine Eigenschaft, die durch eine eigene Rule validiert wird, eine andere arbeitet einfach mit einer Exception. Wie kann ich das Ergebnis aus dem Konstruktor abrufen?

13.09.2016 - 19:36 Uhr

Ich muss mich entschuldigen, der Fehler ist aus einer vergessenen Zuweisungen im ViewModel entstanden. (Coords war null)
Seht es als beantwortet. Danke!

13.09.2016 - 17:35 Uhr

Hier die genauere Fehlerinformation:> Fehlermeldung:

System.Reflection.TargetInvocationException wurde nicht behandelt.
HResult=-2146232828
Message=Ein Aufrufziel hat einen Ausnahmefehler verursacht.
Source=mscorlib
StackTrace:
bei System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
bei System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
bei System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
bei System.Activator.CreateInstance(Type type, Boolean nonPublic)
bei System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)
bei System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
bei System.Activator.CreateInstance(Type type, Object[] args)
bei System.Xaml.Schema.SafeReflectionInvoker.CreateInstanceCritical(Type type, Object[] arguments)
bei System.Xaml.Schema.SafeReflectionInvoker.CreateInstance(Type type, Object[] arguments)
bei System.Xaml.Schema.XamlTypeInvoker.CreateInstance(Object[] arguments)
bei MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstanceWithCtor(XamlType xamlType, Object[] args)
bei MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstance(XamlType xamlType, Object[] args)
bei MS.Internal.Xaml.Runtime.PartialTrustTolerantRuntime.CreateInstance(XamlType xamlType, Object[] args)
bei System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToParentStart(ObjectWriterContext ctx)
bei System.Xaml.XamlObjectWriter.WriteStartMember(XamlMember property)
bei System.Xaml.XamlWriter.WriteNode(XamlReader reader)
bei System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack1 stack, IStyleConnector styleConnector) bei System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) bei System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri) bei System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream) bei System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream stream, ParserContext pc) bei System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties) bei System.Windows.Application.DoStartup() bei System.Windows.Application.&lt;.ctor&gt;b__1_0(Object unused) bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) bei System.Windows.Threading.DispatcherOperation.InvokeImpl() bei System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) bei MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state) bei System.Windows.Threading.DispatcherOperation.Invoke() bei System.Windows.Threading.Dispatcher.ProcessQueue() bei System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean&amp; handled) bei MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean&amp; handled) bei MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) bei System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) bei MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) bei MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG&amp; msg) bei System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) bei System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) bei System.Windows.Application.RunDispatcher(Object ignore) bei System.Windows.Application.RunInternal(Window window) bei System.Windows.Application.Run(Window window) bei System.Windows.Application.Run() bei OpenWeather.GUI.App.Main() in C:\Users\eagle\Dropbox\Programmierung\NET\C#\OpenWeather\OpenWeather.GUI\obj\Debug\App.g.cs:Zeile 0. bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() bei System.Threading.ThreadHelper.ThreadStart_Context(Object state) bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) bei System.Threading.ThreadHelper.ThreadStart() InnerException: HResult=-2147467261 Message=Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. Source=PresentationFramework StackTrace: bei System.Windows.Data.BindingExpression.IsValidValueForUpdate(Object value, Type sourceType) bei System.Windows.Data.BindingExpression.ConvertProposedValue(Object value) bei System.Windows.Data.BindingExpressionBase.UpdateValue() bei System.Windows.Data.BindingExpression.Activate(Object item) bei System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt attempt) bei System.Windows.Data.BindingExpression.AttachOverride(DependencyObject target, DependencyProperty dp) bei System.Windows.Data.BindingExpressionBase.OnAttach(DependencyObject d, DependencyProperty dp) bei System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal) bei System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue(Object instance, Object value) bei MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember member, Object obj, Object value) bei MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst, XamlMember property, Object value) bei MS.Internal.Xaml.Runtime.PartialTrustTolerantRuntime.SetValue(Object obj, XamlMember property, Object value) bei System.Xaml.XamlObjectWriter.Logic_ApplyPropertyValue(ObjectWriterContext ctx, XamlMember prop, Object value, Boolean onParent) bei System.Xaml.XamlObjectWriter.Logic_DoAssignmentToParentProperty(ObjectWriterContext ctx) bei System.Xaml.XamlObjectWriter.Logic_AssignProvidedValue(ObjectWriterContext ctx) bei System.Xaml.XamlObjectWriter.WriteEndObject() bei System.Xaml.XamlWriter.WriteNode(XamlReader reader) bei System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack1 stack, IStyleConnector styleConnector)
bei System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
bei System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
bei System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
bei System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
bei OpenWeather.GUI.OpenWeatherWindow.InitializeComponent() in ...\OpenWeather\OpenWeather.GUI\OpenWeatherWindow.xaml:Zeile 1.
bei OpenWeather.GUI.OpenWeatherWindow..ctor() in ...\OpenWeather\OpenWeather.GUI\OpenWeatherWindow.xaml.cs:Zeile 26.
InnerException:

Ja, der Ressource-Key ist "stringDoubleConverter" =)

13.09.2016 - 15:57 Uhr

Hallo,
während InitalizeComponent wird folgende Exception geworfen:> Fehlermeldung:

System.Reflection.TargetInvocationException wurde nicht behandelt.
HResult=-2146232828
Message=Ein Aufrufziel hat einen Ausnahmefehler verursacht.

Dies tritt auf wenn ich versuche eine Textbox mit Konverter an einen Double zu binden:


    class StringDoubleConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null || value == DependencyProperty.UnsetValue) return DependencyProperty.UnsetValue;
            return value.ToString();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            double retVal;
            var isDecimal = double.TryParse((string)value, out retVal);
            return isDecimal ? retVal : 0;
        }
    }


<TextBox Text="{Binding Coords.Latitude, Mode=OneWayToSource, Converter={StaticResource stringDoubleConverter}}" PreviewTextInput="NumberValidationTextBox"/>

Wieso wird diese Exception geworfen?

09.09.2016 - 15:31 Uhr

Hallo, ich binde eine Textbox mit einer ValidationRule:


                    <TextBox Style="{StaticResource validationErrorTemplate}">
                        <TextBox.Text>
                            <Binding Path="CountryCode" Mode="OneWayToSource" UpdateSourceTrigger="PropertyChanged">
                                <Binding.ValidationRules>
                                    <local:CountryCodeValidationRule/>
                                </Binding.ValidationRules>
                                <Binding.Converter>
                                    <local:CountryCodeConverter/>
                                </Binding.Converter>
                            </Binding>
                        </TextBox.Text>
                    </TextBox>

Hier ist der definierte Style:


                <Style TargetType="{x:Type TextBox}" x:Key="validationErrorTemplate">
                    <Style.Triggers>
                        <Trigger Property="Validation.HasError" Value="true">
                            <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                        </Trigger>
                    </Style.Triggers>
                    <Style.Setters>
                        <Setter Property="Validation.ErrorTemplate">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Border BorderThickness="2" BorderBrush="Red">
                                        <AdornedElementPlaceholder/>
                                    </Border>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style.Setters>
                </Style>

Wenn die Validierung fehlschlägt wird zwar der Tooltip angezeig. Das Error-Template jedoch erst wenn eine Validierung fehlschlägt, nachdem ein korrekter Wert angegeben wurde. Woran liegt das?

05.09.2016 - 22:52 Uhr

Hallo,
Ich möchte je nach dem welcher Radio-Button ausgewählt ist ein Enum-Wert im Viewmodel setzen.
Ein Button entspricht sozusagen einem Enum-Wert. Wie kann ich das realisieren?

04.09.2016 - 19:40 Uhr

Hallo,
ich habe einige Radiobuttons deren Inhalt nur aktiviert sein soll (Textboxen etc.), wenn der Button ausgewählt wurde. Wenn ich für jeden Radiobutton eine Eigenschaft im Viewmodel bereitstellen und dann daran binden ist das sehr viel sich wiederholender Code. Wie kann man das besser lösen?

01.09.2016 - 23:19 Uhr

Hallo,
ich hatte deinen Code bereits getestet, das Ergebniss waren 21 Sekunden. Von diesem Laptop aus, läuft alles ohne erstaunlicher Weise ohne Probleme. Das heißt es muss doch an den Karten liegen, da beide Computer im selben Netzwerk sind. Die letzte Frage ist nun, ist es möglich ohne eine Deinstallation den Fehler auf dem Rechner mit den virtuellen Adaptern zubeheben?

01.09.2016 - 22:49 Uhr

Ich habe den Proxy auf null und auf GlobalProxySelection.GetEmptyWebProxy() gesetzt, beidesmal hat sich nichts geändert. (Eine Warnung weist mich auf null hin, ist die Doku vieleicht veraltet?)
Ich habe hier zwei virtuelle Netzwerkkarten (VMware), habe beide deaktiviert, aber immer noch keine Änderung. Sind die das Problem?

01.09.2016 - 21:50 Uhr

Mir kam das ganze auch sehr komisch vor. Der Sourcecode ist überhaupt nichts besonderes:


readonly WebClient _client;
...
  protected bool Execute(Uri queryURI, out string queryResponse)
        {
            queryResponse = null;
            try
            {
                queryResponse = _client.DownloadString(queryURI);

                return true;
            }
            catch (WebException)
            {
                return false;
            }
       }

http://freegeoip.net/json/ wäre die Adresse die aufgerufen wird. Wie gesagt, bei Anfrage im Browser läuft alles ohne Verzögerung. Mit Wireshark und dem Debugger, ich hänge einfach mal ein Ergebnis an.