dann mach das doch so das du dich folder fuer folder durch arbeitest
gespeicherten path laden
path splitten
objekte einzeln dem tree geben und und expanden lassen sodass der benoetigte pfad geladen wird - das so lange bis zu beim letzten objekt angekommen istaufgabe 1 wird sein das du ein tree hast wo du elemente suchen und als expanded markieren kannst
dann immer tiefer gehen und bei bedarf verzeichnis laden
weißt du vielleicht wie ich einen String (z.B. c:) in ein TreeViewItem umwandeln kann?
Das TreeView in WPF hat keine Nodes. Und die Nodes sind ja noch nicht geladen um in denen zu suchen. Alle beim Programmstart zu laden dauert zu lange.
Ich verwende in einer WPF Anwendung ein TreeView zur Anzeige der Verzeichnisse des Rechners. Beim Programmstart werden erst alle Rootverzeichnisse/Laufwerke mit Directory.GetLogicalDrives() eingelesen. Öffnet der Benutzer ein Laufwerk werden die Unterverzeichnisse eingelesen.
Ich möchte beim Beenden der Anwendung das aktuell gewählte Verzeichnis speichern, damit beim nächsten Programmstart das selbe Verzeichnis in dem TreeView ausgewählt bleibt. Das Speichern des Verzeichnisses ist kein Problem., aber ich finde keinen Weg es bei nächstem Start wieder in TreeView zu laden.
Jemand eine Idee wie ich das machen kann?
hattest du es entfernt ?
wahrscheinlich habe ich es unbewust entfernt. Für Anfänger ist es gut zu wissen, dass InitializeComponent(); unbedingt notwendig ist. Den beim gestalten des UserControls wird "ohne" alles richtig angezeigt, alles wird kompiliert und beim Verwenden sieht man es dann nicht mal im Designer.
das Problem war, dass
InitializeComponent();
in dem Konstruktor des UserControls nicht vorhanden war.
und was erwartest du ?
anhand des codes was du hier gepostet hast muesstest du nur ein rechteck mit der farbe #FF333232 habenwas unschoen ist und eventuell probleme macht ist wenn du die groesse im usercontrol an gibst und dann nochmal beim aufruf
bei solchen sachen sollte man im usercontrol gar keine groesse angeben
ist schon klar. Eben diese Farbe sehe ich nicht. Ich habe es extra abgespeckt um alle Fehlerquellen auszuschließen.
Ich habe ein UserControl erstellt. Wenn man sich die XAML in VisualStudi oder in dem Blend 2 anschaut, sieht alles gut aus. Wenn ich es aber einem Window hinzufüge meckert der Compiler nicht, das Element wird hinzugefügt, aber man sieht es nicht. Es ist einfach ein leeres Rechteck zu sehen. Was könnte es sein? Das Programm läst sich starten, aber das SteuerElement ist einfach nicht zu sehen.
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="bild.PictureViewer" Height="240" Width="720" Background="#FF333232">
</UserControl>
<Window x:Class="bild.Stapelverarbeitung"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:custom="clr-namespace:bild"
Title="Stapelverarbeitung" Height="800" Width="600">
<Grid>
<custom:PictureViewer Height="300" Width="100" />
</Grid>
</Window>
danke winSharp93. So etwas funktioniert ja wirklich einfach.
Nur folgendes mußte ich löschen: DataType="{x:Type System:String}
Das wird von dem Compiler nicht akzeptiert.
ich möchte Ordner auswählen und die dort enthaltene Bilder anzeigen. Meine Kenntnisse in WPF sind wohl zu schlecht. Alle Bücher schneiden nur die Grundlagen an und ich habe noch nicht verstanden wie ich so etwas damit schnell realisieren kann. Besonders nicht mit XAML.
Ist es möglich die ImageListBox auf die Form einer WPF Anwendung zu bringen?
Wobei aber noch erwähnt werden sollte, dass das keine allgemeingültige Lösung ist, da man ja wirklich nur beim SolidColorBrush eine bestimmte Farbe angeben kann. Bei den anderen Brushetypen gibt es ja nicht die eine Farbe.
es ist richtig. Gibt es bei anderen Brushtypen vielleicht einen Zugriff auf die einzelnen Farben über einen Index?
ok, hier ist die Lösung:
Color c = (textBox.Foreground as SolidColorBrush).Color;
Wie kann ich ein Brush in ein Color konvertieren?
Schau dir mal das ViewBox Control an, denke das kann dir Arbeit abnehmen.
hatte ich mir bereits angeschaut, super Ding, aber leider nicht im Designer sichtbar.
Aber danke "talla" für deine Hilfe. Ich werde jetzt doch Canvas einsetzen und alles bei einer Änderung der Fenstergröße verwalten. Ist auch nicht so viel Arbeit.
Wenn ich mit einem Canvas arbeite, dann muss ich beim vergrößern/verkleinern des Fensters manuell alle Elemente in der Größe anpassen, damit die proportional mit dem Fenster die Größe ändern. Mit einem Grid funktioniert das alles automatisch.
das habe ich schon gelesen und andere Quellen ebenfalls. Nichts desto trotz kann ich ein Margin-Element nicht zur Laufzeit einzeln ändern.
Und ich finde keine Möglichkeit eine TextBox mit der Maus zu verschieben und beim loslassen dort zu positionieren. Es muss in einem Grid sein, kein Canvas. Mit WindowsForms ist soetwas kein Problem. Mit WPF ist es wohl nicht ohne weiteres möglich. Ich habe Haufen Beiträge in unterschiedlichen Foren weltweit mit dem selben Problem gesichtet und nirgendwo wurde eine Lösung gefunden.
das hier:
textBoxLogo.Margin.Left = textBoxLogo.Margin.Left + 50.0;
ergibt einen Fehler:
Fehler 1 Der Rückgabewert "System.Windows.FrameworkElement.Margin" kann nicht geändert werden, da er keine Variable ist.
ach in einem Grid ist die Bewegung garnicht möglich?
Sicher ist sie da möglich. Nur eben anders.Bei einem Grid musst du die
> verändern.mfg
SeeQuark
ist das Verändern der Margin-Werte nur auf diese Weise möglich?
textBox.Margin = new Thickness(double left, double top, double right, double bottom)
Das Verändern der einzelne Werte ist nicht möglich? Ich hatte versucht es einzeln zu verändern, das ging nicht und ich hatte es aufgegeben.
Ausserdem scheinen die Margin-Werte zur Laufzeit nicht zu stimmen. Wenn beim Gestalten Margin.Left z.B. 120 ist und das Fenster 800x600. Zur Laufzeit wird das Fenster maximiert die Textgröße bleibt gleich, die Abstände zu den Kanten des Grids werden wesentlich größer, aber wenn man sich Margin.Left anschaut, dann ist es immer noch 120. Dieser Wert stimmt dann auf gar keinen Fall. Wenn man nachmisst, dann sollte der viel größer sein.
Probier mal
>>> .
auch mit dieser Zeile passiert nichts mit der TextBox
Ist die TextBox denn in einem Canvas? Oder ist sie in einem Grid?mfg
SeeQuark
ach in einem Grid ist die Bewegung garnicht möglich? Das erschwert natürlich die Gestaltung wenn es nur ein Canvas sein muss, aber dafür funktioniert das Bewegen. Danke.
.location?
so weit ich weis gibt es unter WPF leider kein .location.
wenn du es in ner schönen animation über die form schieben willst wäre es vielleicht mit wpf recht angenehm zu lösen, da konnte man animationen ziemlich leicht machen
ich möchte die Textbox zur Laufzeit an einer beliebigen Stelle über einem Image positionieren können und ich muss dan die Position genau kennen. Ich weiß nicht ob eine Animation das richtige ist.
Probier mal
> .
EDIT: Wobei man das besser über ein Binding löst.mfg
SeeQuark
auch mit dieser Zeile passiert nichts mit der TextBox
Ich stelle mal hier diese allgemeine Frage. Ist es möglich eine TextBox zur Laufzeit auf der Oberfläche zu bewegen?? Ich habe etwas von textbox1.SetValue(Canvas.LeftProperty, newX); gelesen, aber bei mir hat diese Anweisung keine Funktion. Weiß vielleicht jemand wie ich die genaue Position einer TextBox auf der Oberfläche auslesen kann und wie ich die Position beeinflussen kann?
Weiß vielleicht jemand wie ich die Position einer TextBox über einem Image herausfinden kann?? Im Designer sind bei der Textbox alle vier Margin Werte eingetragen. Wenn das Programm läuft ist die Oberfläche größer als im Designer die Margin Werte müßten sich also vergrößert haben, da die Abstände auf allen vier Seiten zu dem Rand größer sind. Die Margin werte bleiben aber zur Laufzeit immer gleich, unabhängig von der Größe des Fensters. Deswegen ist es unmöglich die Position der Textbox auf der Oberfläche zur Laufzeit genau zu bestimmen. 🙄
ok, die Unschärfe kam, weil man (bi.PixelWidth, bi.PixelHeight) und nicht (bi.Width, bi.Height) verwenden muss. Aber wie die Größe des Textes angepasst werden kann ist mir noch unklar.
mit rtb.Render(drawingVisual); wird auch das gezeichnete Image extrem unscharf. Finde leider keine Lösung für dieses Problem.
ok, ich habe es hin bekommen den Text aus einer TextBox auf ein Image mit folgendem Quelltext zu übertragen.
private void buttonSpeichern_Click(object sender, RoutedEventArgs e)
{
// Text to render on the image.
FormattedText text = new FormattedText(textBoxLogo.Text, new CultureInfo("en-us"),
textBoxLogo.FlowDirection,
new Typeface(textBoxLogo.FontFamily, textBoxLogo.FontStyle, textBoxLogo.FontWeight,
textBoxLogo.FontStretch),
textBoxLogo.FontSize,
textBoxLogo.Foreground);
// The Visual to use as the source of the RenderTargetBitmap.
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
// bi ist ein BitmapImage
drawingContext.DrawImage(bi, new Rect(0, 0, bi.Width, bi.Height));
drawingContext.DrawText(text, new Point(bi.Height / 2, 0));
drawingContext.Close();
RenderTargetBitmap rtb = null;
// drawingVisual rendern
rtb = new RenderTargetBitmap((int)bi.Width, (int)bi.Height, 96, 96, PixelFormats.Pbgra32);
rtb.Render(drawingVisual);
rtb.Freeze();
image1.Source = rtb;
}
Das Problem dabei ist die nicht passende Auflösung. Der kleine Text auf dem Bild ist die TextBox, der große ist der übertragene Text. Ich möchte aber, dass der gezeichnete Text genau so aussieht wie der Text der TextBox im Moment des Zeichnens. Hat jemand eine Idee wie man die Auflösung angleichen kann?
Hier ein Bild:
nicht nur das - der benutzer kann ja die leiste doppelt oder dreifach hoch haben
kann man sowas messen ?
kann man ohne Probleme.
// Gets an array of all the screens connected to the system.
Screen[] screens = Screen.AllScreens;
upperBound = screens.GetUpperBound(0);
int iSichtbareBreite = screens[0].WorkingArea.Width;
int iSichtbareHoehe = screens[0].WorkingArea.Height;
dafür werden folgende Sachen benötigt:
using System.Windows.Forms;
using System.Drawing;
ja, ich arbeite damit. So sieht es bei mir aus:
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
// true = Windows-Authentifizierung
// false = SQL-Server-Authentifizierung
builder.IntegratedSecurity = true;
// Die Datenquelle
builder.DataSource = mySettings.Datenquelle;
// Die Datenbank
builder.InitialCatalog = mySettings.DatenbankName;
// Timeout für die Verbindung
builder.ConnectTimeout = 2;
// Den Connection String bilden
sConnectionString = builder.ConnectionString;
ich habe gerade das selbe Problem. Ich möchte, dass es bei einer falschen Datenquelle früher als nach 15 oder 30 Sekunden abgebrochen wird. Setze ich ConnectTimeout = 2; dauert es trotzdem bis zu 40 Sekunden bis es abgebrochen wird.
Mensch...
Wenn ein User z.B. 100 Bilder öffnet. Werden immer nur maximal 5 Bilder angezeigt. Dann wird es eine Möglichkeit geben in den 100 Bildern zu scrollen (rechts/links).
Feste Column-Anzahl ist genau das was ich haben möchte. Die Column-Breiten und - Margin-Werte sind eben nicht fest.
Was für mich die richtige Lösung ist, entscheide nur ich. Bitte enthalte dich diesem Thread. Das ist lächerlich. Ich sage, dass ich für mich das erreicht habe was ich benötige und du schreibst ist alles falsch und misst. Eine Klette^10...
Vergrößer/Verkleiner mal das Fenster der zweiten Anwendung. Das ist genau das Verhalten was ich erreichen wollte und jede Lösung die zu dem von mir gewünschten Ergebnis führt ist die richtige. Es gibt nicht "DIE RICHTIGE LÖSUNG". .NET ist sehr flexibel und jeder setzt es ein wie er es für richtig hält.
dein "test" steht aber in keiner relation zur irgendeiner dynamic
du hast ein grid mit festen werten
und deine "loesung" war spalten im grid ein zu fuegen
das hilft bei der "echten" loesung ueberhaupt kein stueck da man in der "echten" loesung nicht wirklich mit grid columns und margins in diesem ausmass arbeiten kann
Ich verstehe deinen "Angriff" nicht. Du kennst doch meinen Ziel und meine Vorstellung der Endanwendung nicht. Ich hatte nur gefragt wie ich beim Vergrößern des Anwendungsfensters die Images gleichmäßig skalieren kann und, dass die nicht aufeinander laufen. Genau das wurde mit meiner Lösung erreicht. Wo ist das Problem!? Genieße den Sonntag.
dein "test" steht aber in keiner relation zur irgendeiner dynamic
du hast ein grid mit festen werten
und deine "loesung" war spalten im grid ein zu fuegen
das hilft bei der "echten" loesung ueberhaupt kein stueck da man in der "echten" loesung nicht wirklich mit grid columns und margins in diesem ausmass arbeiten kann
Die werte sind eben nicht fest. Ich lade gleich die exe hoch. Kannst mal anschauen...
das war doch nur ein Test. Natürlich wird meine Anwendung dynamisch sein und die Bilder werden zur Laufzeit von einem User ausgewählt. Scrollen wird möglich sein usw.
und so sieht es dann im Designer aus:
Ich habe das Problem gut lösen können und die Lösung ist sehr simpel. In dem Grid einfach Spalten hinzugefügt, so, dass die Images die Abstände zu den Spaltenrändern einhalten.
<Window x:Class="myClass.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="600" Width="918.5" MinWidth="800" MinHeight="600">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60*" />
<ColumnDefinition Width="100.5*" />
<ColumnDefinition Width="155*" />
<ColumnDefinition Width="265.5*" />
<ColumnDefinition Width="155*" />
<ColumnDefinition Width="100.5*" />
<ColumnDefinition Width="60.001*" />
</Grid.ColumnDefinitions>
<Image FlowDirection="LeftToRight" Margin="13.336,143.362,13.336,138.361" Name="Image1" Panel.ZIndex="0" Source="bild.jpg" Stretch="Uniform" StretchDirection="Both" Grid.Column="3" />
<Image FlowDirection="LeftToRight" Margin="12.4,207.6,12.4,202.8" Name="image4" Panel.ZIndex="0" Source="bild.jpg" Stretch="Uniform" StretchDirection="Both" Grid.Column="4" />
<Image FlowDirection="LeftToRight" Margin="10,236.8,10.4,232" Name="image5" Panel.ZIndex="0" Source="bild.jpg" Stretch="Uniform" StretchDirection="Both" Grid.Column="5" />
<Image FlowDirection="LeftToRight" Margin="11.75,207.6,13.25,202.8" Name="image2" Panel.ZIndex="0" Source="bild.jpg" Stretch="Uniform" StretchDirection="Both" Grid.Column="2" />
<Image FlowDirection="LeftToRight" Margin="10.521,236.8,9.853,232" Name="image3" Panel.ZIndex="0" Source="bild.jpg" Stretch="Uniform" StretchDirection="Both" Grid.Column="1" />
</Grid>
</Window>
Schade, ohne den Designer ist es zu umständlich eine sinnvolle Oberfläche zu realisieren. Kann Blend 2 das anzeigen? Ansonsten muss ich mir eine andere Lösung überlegen. Mit den Windows Forms war alles noch so einfach oder mir fehlt halt das Wissen zu WPF. Oder die Technik ist noch nicht ganz ausgereift. Was soll's. Vielleicht hat noch jemand einen Vorschlag wie so etwas ohne ViewBox möglich ist!?
ok, danke. So funktioniert es. Aber ist es normal, dass man die Images im Designer nicht sieht???
hab ein Viewbox ausprobiert. Genau das selbe Verhalten
Setzt das Grid (oder was auch immer) in eine Viewbox.
mfg
SeeQuark
aber was bringt das? Ich möchte, dass sich die Images vergrößern, aber halt alles proportional zu der Ausgangsanordnung. Hast du vielleicht ein Beispiel für mich?
Bild 2 (nach dem Vergrössern)
Bild 1 (normal):
Ich verstehe nicht wie man in WPF Steuerelemente gleichmessig anordnen kann, so dass es beim Vergrössern des Fensters auch gleichmässig bleibt.
Mein XAML Code:
<Window x:Class="myClass.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="600" Width="800" MinWidth="800" MinHeight="600">
<Grid>
<Rectangle Name="rectangle1" Stroke="Black" />
<Image FlowDirection="LeftToRight" Margin="276,158.591,282,170.591" Name="Image1" Panel.ZIndex="0" Source="bild.jpg" Stretch="Uniform" StretchDirection="Both" />
<Image FlowDirection="LeftToRight" Margin="185,223.18,517.748,222.41" Name="image2" Panel.ZIndex="0" Source="bild.jpg" Stretch="Uniform" StretchDirection="Both" Grid.IsSharedSizeScope="False" />
<Image FlowDirection="LeftToRight" Margin="510.013,223.59,193,222.41" Name="image4" Panel.ZIndex="0" Source="bild.jpg" Stretch="Uniform" StretchDirection="Both" />
<Image FlowDirection="LeftToRight" Margin="99,245.796,624,241.398" Name="image3" Panel.ZIndex="0" Source="bild.jpg" Stretch="Uniform" StretchDirection="Both" />
<Image FlowDirection="LeftToRight" Margin="618,245.796,105,241" Name="image5" Panel.ZIndex="0" Source="bild.jpg" Stretch="Uniform" StretchDirection="Both" />
</Grid>
</Window>
Danke. Das habe ich schon gesehen, aber leider verstehe ich nicht wie ich damit auf ein Bild zeichnen kann.
Mich stört diese Verhalten ebenfalls. Man könnte eventuell beim Start die aktuelle Auflösung auslesen und das Fenster manuell so skalieren, dass die Taskleiste nicht verdeckt ist.
Hallo,
gibt es eine möglichkeit einen Text so wie es in einem Label formatiert worden ist in ein Bitmap zeichnen? Also nicht einfach g.DrawString?
bei "Windows Forms Anwendungen" gab es ja label.DrawToBitmap Funktion. Es ist bei WPF leider nicht mehr bei dem Label dabei. Gibt es da eine andere Lösung?
Hallo,
wie kann ich immer auf volle Zahl aufrunden?
Also
2.6 => 3
2.1 => 3
HAT SICH ERLEDIGT: Math.Ceiling()
entschuldigung für die übereilte Frage.
Seltsam ist aber, das ich keinen entsprechenden Eintrag bei Microsoft Connect gefunden habe.
Am besten, du schlägst das dort mal vor.
und saveFileDialog am besten gleich mit. Die Begründung wieso das alles nicht enthalten ist: aus Sicherheitsgründen.
So ein Unsinn. Dann dürfte Browser gar keine "Speicher unter" Funktion zulassen. Und Bildbearbeitung funktionierte schon in Java Applets.