Hallo!
Ich habe eine art Legende, also ein Kästchen mit einem Pfeil, als custom shape erstellt, wobei der Pfeil außerhalb der Bounds des shapes gezeichnet werden soll. Hier der Code:
public sealed class Legend : Shape
{
public static readonly DependencyProperty ArrowLocationProperty = DependencyProperty.Register("ArrowLocation", typeof(Point), typeof(Legend), new FrameworkPropertyMetadata(new Point(-50, -50), FrameworkPropertyMetadataOptions.AffectsRender));
[TypeConverter(typeof(PointConverter))]
public Point ArrowLocation
{
get { return (Point)base.GetValue(ArrowLocationProperty); }
set { base.SetValue(ArrowLocationProperty, value); }
}
protected override Geometry DefiningGeometry
{
get
{
var r = new RectangleGeometry(new Rect(0, 0, Width, Height));
PathGeometry p = new PathGeometry();
p.Figures.Add(
new PathFigure(
new Point(20, 0),
new List<PathSegment> { new LineSegment(ArrowLocation, true), new LineSegment(new Point(0, 20), true) },
true
)
);
CombinedGeometry cg = new CombinedGeometry(GeometryCombineMode.Union, p, r);
return cg;
}
}
}
Ich benutze die Legende in einem Canvas:
<Window x:Class="LegendTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LegendTest"
mc:Ignorable="d" WindowStartupLocation="Manual" WindowStyle="None" AllowsTransparency="True"
Title="MainWindow" Height="350" Width="525" Background="{x:Null}">
<Grid>
<Canvas x:Name="MainCanvas" ClipToBounds="False" Background="white">
<local:Legend x:Name="legend" Fill="Aquamarine" ArrowLocation="-50 -50" Width="100" Height="100" ClipToBounds="False" Canvas.Left="200" Canvas.Top="100" />
<local:Legend x:Name="legend2" Fill="Aquamarine" ArrowLocation="-50 -50" StrokeThickness="1" Stroke="Black" Width="100" Height="100" ClipToBounds="False" Canvas.Left="50" Canvas.Top="100" />
</Canvas>
</Grid>
</Window>
Das Ergebnis ist im Angang dargestellt: Die Legende ohne Rahmen wird richtig dargestellt. Die Legende mit Rahmen nicht (Pfeil fehlt). Im Designer werden beide Shapes korrekt dargestellt. Ich habe leider keine Ahnung was da schief läuft.
Ich will vor allem vorhandene CAD-Dateien laden (vorzugsweise DXF und DWG-Dateien) und anzeigen. Konstruieren muss ich nichts können, jedoch sollen die Dateien korrekt angezeigt werden.
Später will ich dem Anwender die Möglichkeit geben einfache Linien und Anmerkungen zur Zeichnung hinzuzufügen. Dass muss aber nicht notwendigerweise durch die Bibliothek verwirklicht sein.
Ich will das Ganze in WPF einsetzen, kann aber auch WinForms sein.
Früher hatte ich in meiner Software hierfür ein Imagenation-Plugin (das ist jetzt der OpenText Desktop Viewer). Das war allerdings sehr instabil (Abhängig vom verwendeten Dateityp) und langsam.
Hallo!
Ich suche eine möglichst freie oder kostengünstige Bibliothek zum Einbinden in meine Software, mit der man 2D CAD-Dateien darstellen und manipulieren kann.
Ich habe hierzu im Netz und im Forum leider noch nichts brauchbares gefunden.
Hat jemand schon einmal eine solche Bibliothek eingesetzt?
OK. Jetzt weis ich wenigstens, dass ich nicht grundlegend was falsch gemacht habe.
Da ich bereits alle ViewModels in meinen Anwendungen nach einem ähnlichen Muster aufgebaut habe, werde ich erst einmal bei meinem Workaround von oben bleiben.
Trotzdem Danke!!
Danke schonmal. Das funktioniert schon mal bei dem einfachen Beispiel.
In meiner Anwendung ist jedoch im Moment darauf angewiesen, dass die Eigenschaft CurrentEmployee im ViewModel bei der Aktualisierung gesetzt wird. Das geschieht in deiner Version jedoch auch nicht.
<DataGrid ItemsSource="{Binding Employees}" SelectedItem="{Binding CurrentEmployee}" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True" CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="True">
Meine Datenbindung der TextBox hatte übrigens funktioniert, bis ich die Validierung hinzugefügt habe.
OK. Anbei die stark vereinfachte Mini-Testanwendung.
Unterhalb des DataGrids habe ich eine Textbox, die den Namen des aktuell gesetzten Mitarbeiters aus dem ViewModel anzeigt.
Wenn im DataGrid einer ausgewählt wird, so erscheint er leider nicht, da im ViewModel gar keine Änderung am CurrentEmployee ankommt.
<Window.BindingGroup>
<BindingGroup>
<BindingGroup.ValidationRules>
<my:CompanyValidationRule />
</BindingGroup.ValidationRules>
</BindingGroup>
</Window.BindingGroup>
Wenn ich die Zeilen oben mit der BindingGroup auskommentiere, dann funktionierts.
Ich habe das Problem leider immer noch.
Als Workaround kann ich natürlich das SelectionChanged-Event des DataGrids verwenden, um mein ViewModel zu aktualisieren. Das ist aber nicht Sinn vom MVVM und außerdem Fehleranfällig.
private void DataGrid_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
(DataContext as CompanyViewModel).CurrentEmployee = (sender as System.Windows.Controls.DataGrid).SelectedItem as Employee;
}
Hat denn niemand eine Idee?
Hallo!
verwende MVVM um meine Formulare vom Code zu trennen.
Jetzt habe ich ein Fenster, in dem ein paar TextBoxen sind und ein DataGrid, welches eine Liste mit Objekten zeigt, die jedoch nicht bearbeitbar sein sollen. Sieht prinzipiell so aus:
<DataGrid ItemsSource="{Binding Employees}" SelectedItem="{Binding CurrentEmployee}" Grid.Row="1" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True" CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="True">
<DataGrid.Columns>
...
</DataGrid.Columns>
</DataGrid>
Das funktioniert auch, aber wenn ich in dem Formular eine BindingGroup hinzufüge, wird der "CurrentEmployee" in meinem ViewModel nicht mehr gesetzt.
<Window.BindingGroup>
<BindingGroup>
<BindingGroup.ValidationRules>
<helpers:CompanyValidationRule />
</BindingGroup.ValidationRules>
</BindingGroup>
</Window.BindingGroup>
Habe leider keine Ahnung an was das liegen könnte.
Hallo nochmal!
Hier mal meine gekapselte Mail-Funktion. So hat es bei einem ASP.NET-Projekt von mir funktioniert. Ich hatte kein SSL aktiviert.
public bool SendMail(string To, string from, string Subject, string BodyText)
{
MailMessage mail = new MailMessage();
try {
mail.To.Add(To.Trim());
mail.Subject = Subject;
mail.Body = BodyText;
mail.IsBodyHtml = true;
mail.From = new MailAddress(from);
SmtpClient mailClient = new SmtpClient("hostip");
mailClient.Port = 25;
mailClient.Credentials = new System.Net.NetworkCredential("username", "pw");
mailClient.Send(mail);
return true;
}
catch {
return false;
}
}
Das Thema gehört eigentlich nicht in das GUI-Forum.
Versuche mal als Absenderadresse eine Emailadresse anzugeben, mit der du empfangen kannst, dann solltest du Fehlermeldungen vom Empfänger-Emailserver zurück erhalten.
Der Code sollte normalerweise funktionieren. Habe ich so ähnlich auch schon gemacht.
Stimmt der Host? Bei mir war das smtp.googlemail.com