Laden...

Forenbeiträge von Cuin Ingesamt 92 Beiträge

20.04.2011 - 22:28 Uhr

Hallo 0odarkio0,

du kannst ja mal versuchen die While-Schleife umzuschreiben, eventuel hilft es dir ja bei der Problemsuche:

do {
   suche_gw_1 = bild_quelle.IndexOf("<img src=\"", bild_2);
   if (suche_gw_1 != -1)
   {
      suche_gw_1 += 10;
      suche_gw_2 = bild_quelle.IndexOf("/>", suche_gw_1);
      suche_gw_2 -= 2;
      bilder_gw[bilder_gw_zaehler] = bild_quelle.Substring(suche_gw_1, suche_gw_2 - suche_gw_1);
      bilder_gw_zaehler++;
      bild_2 = suche_gw_2;
      MessageBox.Show(suche_gw_1.ToString());
   }
   else
   {
      break;
   }
} while (true);

oder besser so:

while(true) {
   suche_gw_1 = bild_quelle.IndexOf("<img src=\"", bild_2);
   if (suche_gw_1 != -1)
   {
      suche_gw_1 += 10;
      suche_gw_2 = bild_quelle.IndexOf("/>", suche_gw_1);
      suche_gw_2 -= 2;
      bilder_gw[bilder_gw_zaehler] = bild_quelle.Substring(suche_gw_1, suche_gw_2 - suche_gw_1);
      bilder_gw_zaehler++;
      bild_2 = suche_gw_2;
      MessageBox.Show(suche_gw_1.ToString());
   }
   else
   {
      break;
   }
}

Edit: Du kannst ja mal einen Breakpoint in die Else-Bedingung reinsetzen, wenn dieser Breakpoint nie erreicht wird, dann hast du hier definitiv eine Endlosschleife.

mfg Cuin

04.02.2011 - 17:44 Uhr

Vielen Dank für eure Hilfe, ich habs jetzt geschafft alle möglichen Kommentare richtig auszulesen und zuzuordnen.

Wobei die Zeichenkombination /* durchaus vorkommen darf. /* /* */ ist ein legaler C#-Kommentar. Was du verbieten musst, ist dass die Zeichenkombination */ vorkommt. 😃

Stimmt, daran hab ich garnicht gedacht 😃

@m0rius: Den Ausdruck

/\*(?<comment>.*?)\*/

hatte ich schon ausprobiert gehabt, leider hat er bei mehreren hintereinanderliegenden mehrzeiligen Kommentaren Probleme verursacht (Auch bei der RegexOption "Singleline"). Z.B.:

/* Dies
ist ein mehrzeiliger Kommentar */
/* Dieser hier
auch */
irgendeinausdruck;

P.S: Getestet habe ich den regulären Ausdruck mit dem On-the-fly Regex-Tester: Regex-Lab von herbivore.

Den benutze ich auch 😃 Der ist echt super!

Gelöst habe ich das ganze mit Hilfe des Links den herbivore angegeben hat (RegexOption "Singleline" aktivieren):

/\*(?<Comment>((?!\*/).)*)\*/

Vielen Dank für eure Hilfe!

mfg Cuin

04.02.2011 - 16:13 Uhr

Hallo,

ich habe ein Problem beim Filtern von C-Kommentaren aus einer ASCII-Datei (txt-Datei).

Und zwar kommen in dieser Datei mehrere derartige Kommentare vor:

Irgendeinausdruck; /* Ein Kommentar */
Einzweiterausdruck; /* Zweiter Kommentar */

Ich möchte jetzt den ersten Kommentar rausfiltern, dazu habe ich folgendes Regex-Pattern geschrieben:

(?<name>Irgendeinausdruck)[^;]*;[^\n]*/\*(?<Comment>[^(/\*)]*)\*/

Mein Problem befindet sich in diesem Ausschnitt des Pattern:

/\*(?<Comment>[^(/\*)]*)\*/

Ich möchte also den Text filtern, der zwischen /* und / steht.
Leider liefert mir mein Regex-Ausdruck dann alles was zwischen dem Anfang des ersten Kommentars und dem Ende des zweiten Kommentars steht.
Ich möchte also dieses "gierige Verhalten" ausschalten, indem ich angebe, dass die Zeichenkombination "/
" nich vorkommen darf.

Leider kann ich aber mit [^...] nur einzelne Zeichen verbieten, nicht aber eine Zeichenkombination. Hat jemand eine Ahnung wie ich das lösen kann? Ein ?-Zeichen einfach nach

(?<Comment>[^(/\*)]*)

zu setzen liefert leider überhaupt kein Ergebnis.

mfg Cuin

03.12.2010 - 20:12 Uhr

Hallo talla,

danke für deine Hinweise. Zufälligerweise habe ich gestern schon irgendwo gelesen, dass man INotifyPropertyChanged implementieren sollte, was ich dann auch ausprobiert habe, aber leider keinerlei Auswirkungen hatte.

            private void NotifyPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
            public string Min
            {
                get
                {
                    return (this.min);
                }
                set
                {
                    int result;

                    if (int.TryParse(value.ToString(), out result))
                        if (result < 0 || result > 65535)
                            this.min = "0";
                        else
                            this.min = result.ToString();
                    else
                        this.min = "0";

                    NotifyPropertyChanged("Min");
                }
     }

Wie man in WPF Validiert wusste ich auch schon, da ich aber die Fehler in ähnlicher Art und Weise wie Visual Studio ausgeben wollte, dachte ich, dass mir die Validation Rules nix bringen, aber durch den von dir angegebenen Link glaube ich, dass ich mein Vorhaben auch mit Validation Rules lösen kann.
Ich werde es auf jedenfall mal ausprobieren 😃

Vielen Dank

[EDIT]Ich weiß jetzt wieso meine Textbox die Daten nicht aktualisiert:

As you learned earlier, WPF quietly ignores data binding errors
that occur when setting or getting properties. In this case, the user won’t have any way of knowing that
the update has been rejected. In fact, the incorrect value will remain in the text box—it just won’t be
applied to the bound data object. To improve this situation, you need the help of the
ExceptionValidationRule, which is described next.

02.12.2010 - 22:28 Uhr

Hallo alle Zusammen,

ich habe folgendes Problem: Mein DataGrid hat als Itemsource eine ObservableCollection<TestKlasse>-Liste.

Die einzelnen Spalten meines Datagrids binde ich folgendermaßen:

<DataGridTextColumn Header="Value" Width="*" Binding="{Binding Type}" IsReadOnly="True"/>

Mein DataGrid verfügt außerdem über RowDetails, in welchen sich weiter Textboxen befinden, die ich ebenfalls an eine Klassen-Variable meiner ObservableCollection-Liste binden möchte.

 <TextBox Name="Min" Grid.Row="0" Grid.Column="1" Text="{Binding Path=Min, UpdateSourceTrigger=PropertyChanged}" Margin="0" MaxLines="1" VerticalAlignment="Center"/>

Und hier ein Beispiel einer Klassen-Variable:

            public string Min
            {
                get
                {
                    return (min);
                }
                set
                {
                    int result;

                    if (int.TryParse(value.ToString(), out result))
                        if (result < 0 || result > 65535)
                            value = "0";
                        else
                            value = result.ToString();
                    else
                        min = "0";
                }
            }

Ich möchte damit verhindern, dass der User ein ungültiges Zeichen in die Textbox eingibt und das automatisch die Variable "Min" gesetzt wird.
Wenn ich aber irgendwas in die Textbox eingebe, dann wird auch der Setter der Min-Variable aufgerfuen, jedoch hat das setzen von "value" oder "min" keinerlei auswirkungen auf den Inhalt meiner Textbox...

Ich habe die Validierung einer Textboxeingabe in einem anderen Teil meines Projektes hingekriegt, aber da sich die jetztige Textbox in den RowDetails befinden, funktioniert das ganze nicht mehr... hat jemand eine Idee was ich falsch mache?

mfg Cuin

22.11.2010 - 23:10 Uhr

Hallo herbivore,

auch von mir vielen Dank für dieses tolle Programm!
Es hat mir meine Arbeit sehr erleichtert!

mfg Cuin

22.11.2010 - 22:46 Uhr

Hallo xxMUROxx,

schade das man das nicht ausschalten kann... Mit Mausdown würde es bestimmt auch funktionierten, habe es aber jetzt mit einem Stackpanel gelöst, dass eine CheckBox und einen TextBlock beinhaltet. Ich fange dann noch die checkBox1_Checked und -UnChecked Events ab und selektiere dann das jeweilige Item in der ListBox.

Funktioniert auch ganz gut soweit 😃

Vielen Dank

mfg Cuin

22.11.2010 - 21:01 Uhr

Hallo,

ich habe eine Listbox, die ich zur Laufzeit mit Checkboxen fülle. Wenn ich auf das "label" neben dem kästchen der Checkbox klicke, toggelt die "IsChecked"-Property der Checkbox. Ich möchte aber, das man die Checkbox nur "checken" kann, wenn man auf das Kästchen klickt. Sprich: ich will dem Benutzer ermöglichen die checkbox zu selektieren ohne sie zu "checken". Mit rechts-klick funktioniert das ganze schon standartmäßig.

Hat jemand eine Idee wie man dieses Verhalten abschalten kann? Ich könnte natürlich auch einfach eine Checkbox ohne Content einfügen und daneben einen Textblock oder sowas, aber vllt geht es ja auch einfacher^^

18.11.2010 - 14:18 Uhr

Oh super! Deine Version funktioniert einwandfrei 😃

In meiner Version wird nämlich Paste garnicht abgefangen... gut das du es noch erwähnt hattest!^^

mfg Cuin

18.11.2010 - 02:23 Uhr

Hallo,

ich habe folgendes Problem. Ich möchte einem Benutzer verbieten in einer Textbox unerlaubte Zeichen einzugeben. Dazu habe ich folgendes gemacht:

        private void TextBoxName_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            char[] chararray = e.Text.ToCharArray();

            foreach (char c in chararray)
            {
                if (!char.IsLetterOrDigit(c) && c != '_')
                    e.Handled = true;
            }
        }

        private void TextBoxName_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Space)
                e.Handled = true;
        }

Das funktioniert soweit auch ganz gut, bloss wird das Drücken der Leertaste nicht erkannt. Der Benutzer kann also beliebig viele leerzeichen machen, obwohl das eigentlich nicht funktionieren sollte. Die Events werden beim drücken der leertaste auch garnicht aufgerufen... hat jemand eine Idee was ich da machen könnte?

mfg Cuin

[EDIT]Ups, musste einfach nur das Event KeyDown durch PreviewKeyDown ersetzen.^^ Allerdings frage ich mich trotzdem, wieso "TextBoxName_PreviewTextInput" beim drücken der Leertaste nicht gefeuert wird...

27.10.2010 - 19:10 Uhr

Hallo gfoidl,

vielen vielen Dank für deine Tipps^^

Ich habe es jetzt hingekriegt:

Assembly _assembly;
Stream _ConfigStream;

_assembly = Assembly.GetExecutingAssembly();                    
_ConfigStream = _assembly.GetManifestResourceStream("myNamespace.Config.xml");

 xml.Load(_ConfigStream);

Diese Seite erklärt ziemlich gut wie es geht (wenn auch sehr schlecht übersetzt):

http://support.microsoft.com/kb/319292/de

27.10.2010 - 18:33 Uhr

Hallo gfoidl,

ich habe jetzt mal die datai aus dem Resourcenmanager gelöscht und so wie du gesagt hattest die build-action der file auf "eingebettet resource" gestellt. Wenn ich jetzt das programm starte, dann findet er die datei leider nicht, wenn ich aber die Einstellung: "InAusgabeverzeichniskopieren" auf "immer" einstelle, dann findet er die datei, aber dann habe ich neben meiner exe auch noch meine xml-datei liegen, was ich nicht so gut finde...

Und wenn ich mein xml-datei als txt datei hinterlege, dann habe ich das selber problem, also dass VS die datei dann in bin/debug sucht...

Gibts da noch eine möglichkeit oder mache ich was falsch?

mfg Cuin

27.10.2010 - 18:14 Uhr

Hallo alle Zusammen,

ich habe folgendes Problem:

In meiner Projektmappe habe ich dort, wo auch alle anderen CS-Files liegen eine XML-Datei erstellt. Sie enthält einige Daten, die ich für den ablauf meines Programmes benötige. Ich möchte nun den Inhalt dieser Datei zur Laufzeit laden. In etwa so:

XmlDocument xml = new XmlDocument();
xml.Load("Config.xml");

Leider sucht VS dieses Dokument im bin/Debug Ordner, es soll aber als Resource mitgegeben werden (ähnlich wie Bilder oder icons, die man als Resource mitgeben kann). Ich möchte auch nicht, dass der Anwender mein Programm erst installieren muss, sondern die .exe-Datei ausreicht und keine weiteren dateien mitgeliefert werden müssen.

Ich habe schon versucht meine xml-datei als resource zu definieren, dass hatte aber leider keinen erfolg... hat jemand eine Idee wie ich das realisieren könnte?

mfg Cuin

26.10.2010 - 18:19 Uhr

Weil die Tabellen ja erst zur Laufzeit generiert werden und ich somit nicht weiß, wieviele spalten mein Datagrid hat, es soll nur die letzte spalte den verfügbaren platz einnehmen.
Oder geht das auch mit wenig aufwand per xaml?

Das datagrid wird dynamisch in abhängigkeit des gewählten knotens eines treeviews gefüllt.

26.10.2010 - 00:55 Uhr

Habe ein Workaround entwickelt:

Man setzt einfach die Breite der letzten Spalte auf "IsStar":

datagrid.Columns[1].Width = new DataGridLength(1.0, DataGridLengthUnitType.Star);

Das hat zur Folge, dass die letzte spalte (damit meine ich die letzte spalte von meiner Tabelle und nicht die automatisch generierte platzhalter-spalte) den rest des verfügbaren platzes in anspruch nimmt, und somit diese automatisch generierte spale verschwindet.

mfg Cuin

25.10.2010 - 23:48 Uhr

Ich habe es jetzt mal so versucht, wie du vorgeschlagen hattest:

DataGridTextColumn test = new DataGridTextColumn();
                    test.Header = "TestHeader";
                    datagrid.Columns.Add(test);

Leider hatte das keine Auswirkungen...

Ich habe hier mal ein bild angehängt, damit ihr sehen könnt, was ich meine:
(das rote kästchen zeigt nur, wo die spalte aufhört, weil man das so schlecht sieht)

25.10.2010 - 22:28 Uhr

Ich wollte das eigentlich so in der Art realisieren:

datagrid.DataContext = dataset.Tables["Test"];

Das klappt auch wunderbar... bloss habe ich dann immernoch eine zusätzliche leere spalte, die einfach unschön ist....

Vllt ist der Ausdruck "zusätzliche Spalte" auch schlecht ausgedrückt... ich kann NICHT per datagrid.columns[index der letzten spalte] auf die letzte spalte zugreifen... die letzte spalte ist somit quasi nur ein platzhalter...

evtl. würde es auch reichen die weite der "vorletzten" spalte auf "fill" zu setzen, so wie es in winforms möglich war...
Leider funktioniert das hier aber nicht:

datagrid.Columns[1].Width = '*';

Hat jemand eine idee wie ich das machen könnte?

25.10.2010 - 21:10 Uhr

Hallo,

weiß jemand von euch, wie man die automatisch generierte Spalte eines Datagrids löschen kann?

Wenn ich meinem datagrid eine tabelle mit zwei spalten als datasource angebe, dann werden die zwei spalten zwar schön angezeigt, aber es wird noch eine dritte (leere) spalte automatisch hinzugefügt... wie krieg ich die weg?

Bei den Zeilen gibt es so einen ähnlichen effekt, bloss kann man die zusätzlich hinzugefügte zeile mit CanUserAddRows = false oder so ähnlich löschen...

mfg Cuin

15.10.2010 - 16:51 Uhr

Google sagt:

InputGestureText macht nichts weiter, als einen Text neben dem
Menüeintrag anzuzeigen, der den alternativen Aufruf dieses Befehls
beschreibt. Die Behandlung der Tastenkombination muss dabei von Dir
selbst vorgenommen werden. Die Nutzung von Command Objekten mit
zugewiesener KeyGesture wäre unter WPF eine elegante Möglichkeit das zu
lösen.

Wenn Du diesen Command Deinem Menüeintrag zuweist, kannst Du auch auf
die separate Angabe von InputGestureText verzichten, das wird dann
automatisch übernommen.

mfg Cuin

15.10.2010 - 12:11 Uhr

Jop, hatte die Klasse von DependencyObject abgeleitet, dass hatte aber irgendwie keine Auswirkungen auf mein Programm.

Die Methode ändert einfach nur das Icon des TreeViewItem auf Expanded (Also geöffnetes Ordner-Symbol). Dann gibts noch das Pendant zu Collapsed. Ich meine damit, ob es sinnvoll ist irgendwelche Methoden in die Klasse hinzuzufügen, die irgendwie was mit dem TreeView zu tun haben, aber nicht unbedingt was mit "DependencyObjekt" zu tun.

 static void FolderExpanded(object sender, RoutedEventArgs e)
 {
     TreeViewItem item = (TreeViewItem)sender;
     SetIsRootLevel(item, TreeIcon.Open);
     e.Handled = true;
 }
15.10.2010 - 00:36 Uhr

Habe ein kleines, wenn auch sehr spezifisches Workaround dazu entwickelt. Man setzt einfach MinWidth der ersten Spalte auf einen festen Wert und MaxWidth läßt man anhand der Größe des Grids berechnen.

MaxWidth="{Binding Converter={StaticResource MaxWidthConverter}, ElementName=Grid, Path=ActualWidth, ConverterParameter=12}"

mfg Cuin

14.10.2010 - 20:56 Uhr

Hallo Dr.Med.Lol,

ich weiß, dass es vllt jetzt etwas unpassend ist:

Aber wenn es dir mehr um das RPG-Spiel geht, als um das Programmieren, dann kann ich dir den RPG-Maker empfehlen... da kannste du ne Menge damit machen und musst dich nicht um jede Kleinigkeit kümmern...

mfg Cuin

14.10.2010 - 20:46 Uhr

Nene^^ Ich habe das ganze quasi von vorn gemacht. Also die Methoden etc. von dem vorhin genannten Beispiel in mein Code kopiert und passend gemacht und getestet. Und danach NUR die Namen geändert und wieder getestet und dann aufeinmal funktionierte das ganze nicht mehr...

Und Triggern tu ich auf die Werte 0,1 und 2. =) Außerdem hat das ganze ja schon 100% funktioniert... bloss nach dem schließen des Programmes hat VS rumgemeckert, das "local" keinem Namespace zugeordnet werden kann...

Eine letzte Frage habe ich aber noch zu diesem Thema:

Meine Klasse TreeViewItemProps ist jetzt von DependencyObject abgeleitet. Sollte ich meine "static void FolderExpanded(object sender, RoutedEventArgs e)"-Methoden in eine andere Klasse setzen oder ist das egal? Weil die sich gegenwärtig immer noch in TreeViewItemProps befinden...

mfg Cuin

14.10.2010 - 20:13 Uhr

Also ich versteh die Welt nichtmehr...

ich habe jetzt einfach die ganzen Methoden wie in dem vorhin genannten Beispiel umbenannt und auf einmal funktioniert das ganze... Kann es sein, dass IsRootLevel oder IsRootLevelProperty irgendetwas vordefiniertes ist? Oder das vllt TreeViewImage was vordefiniertes ist??

Hier mein jetztiger Code:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}, Path=(local:TreeViewItemProps.IsRootLevel)}" Value="0">
    <Setter TargetName="img" Property="Source" Value="Images/FolderClosed.png" />
</DataTrigger>

Und die DependencyProperty:

public static readonly DependencyProperty IsRootLevelProperty =
    DependencyProperty.RegisterAttached(
    "IsRootLevel",
    typeof(int),
    typeof(TreeViewItemProps),
    new UIPropertyMetadata(0));

Also ich habe wirklich nix anderes gemacht, als die Dinger umzubennen...
Als [gelöst] kann man den Thread aber leider trotzdem nicht setzen, da ich immer noch nicht weiß, was mein Fehler war... naja, hauptsache das ding funktioniert jetzt^^
Vielen Dank für eure Hilfe!!

mfg Cuin

14.10.2010 - 14:38 Uhr

Ich habe grade eben nochmal die Seite gefunden, von der ich mehr oder weniger abgeschrieben habe:

http://joshsmithonwpf.wordpress.com/2007/11/09/reaction-to-a-simple-wpf-explorer-tree/

Also bis auf die Namen, habe ich soweit fast alles übernommen.

TreeViewItemsProps ist eine Klasse die die DependencyProperty TreeViewImageProperty enthält. Und in dieser ist TreeViewImage definiert?

Ich seh grade den Wald vor lauter Bäumen nicht^^

mfg Cuin

14.10.2010 - 14:07 Uhr

So was ähnliches wollte ich auch gerade posten^^

Mit "Path=TreeViewImage" lässt sich die Anwendung zwar starten, aber im Ausgabefenster kommen derartige Meldungen:

System.Windows.Data Error: 40 : BindingExpression path error: 'TreeViewImage' property not found on 'object' ''TreeViewItem' (Name='')'. BindingExpression:Path=TreeViewImage; DataItem='TreeViewItem' (Name=''); target element is 'ContentPresenter' (Name='PART_Header'); target property is 'NoTarget' (type 'Object')

Vllt könnt ihr damit ja was anfangen... offensichtlich findet er hier etwas nicht...

mfg Cuin

[Edit]Mit Path=(local:TreeViewItemProps.TreeViewImage)" kommen aber keine Fehler zur laufzeit... da funktioniert ja auch alles so wie es soll... oO?

14.10.2010 - 14:00 Uhr

Ja, den würde ich auch gerne zulassen, aber ab und zu braucht man den dann doch noch. Und da das meine erste WPF-Anwendung ist, kann man nicht ausschließen, dass ich irgendwo einen Fehler drin habe 😉

Wieso lässt sich die Anwendung überhaupt compilieren, wenn ich "Path=TreeViewImage" anstatt Path=(local:TreeViewItemProps.TreeViewImage)" schreibe?

In diesem Beispiel wird das etwas anders gemacht als ich es mache:

How to show different text based on an enum value?

Kann es sein, dass ich, wie in dem Beispiel, einen Setter und getter benötige??

[EDIT]Hab ich grade gemacht: Hat leider nix geändert.

mfg Cuin

14.10.2010 - 13:36 Uhr

Hallo,

mich beschäftigt schon seit 2 Tagen ein Problem, und zwar geht es um ein TreeView, in dem ich die Icons, je nach TreeViewItem-Typ selber einstellen möchte. (Z.b.: unterschiedliche Icons für Expanden und Collapsed).

Das klappt auch bisher ganz wunderbar. Mein Programm lässt sich auch compilieren und starten. Wenn ich jedoch das Programm schließe, oder im Designer was ändern will, dann meckert VS 2010 immer: "Das Präfix "local" kann keinem Namespace zugeordnet werden. "

In folgender Zeile tritt der Fehler auf:


<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}, Path=(local:TreeViewItemProps.TreeViewImage)}" Value="2">
    <Setter TargetName="img" Property="Source" Value="Images/FolderOpen.png" />
</DataTrigger>

Wenn ich das hier schreibe, dann tritt kein Fehler mehr auf, aber die Icons werden dann nicht mehr angezeigt:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}, Path=TreeViewImage}" Value="2">
    <Setter TargetName="img" Property="Source" Value="Images/FolderOpen.png" />
</DataTrigger>

local wurde so definiert:

xmlns:local="clr-namespace:dummyNamespace"

Die Klasse TreeViewItemProps schaut so aus (Ausschnitt):

class TreeViewItemProps
{
    static void SetTreeViewImage(DependencyObject obj, int value)
	{
        obj.SetValue(TreeViewImageProperty, value);
	}

    public static readonly DependencyProperty TreeViewImageProperty =
		DependencyProperty.RegisterAttached(
        "TreeViewImage", 
		typeof(int), 
		typeof(TreeViewItemProps), 
		new UIPropertyMetadata(1));
}

Weiß jemand, was ich falsch mache?

mfg Cuin

13.10.2010 - 14:56 Uhr

Das würde mich auch interessieren^^ Habe so ein ähnliches Problem.

mfg Cuin

13.10.2010 - 02:46 Uhr

Hallo,

Default.ToolBarTrayVisibility ist vom Typ "int".

Habe es jetzt endlich hingekriegt mit dem BooleanToVisibilityConverter.

Vielen Dank für eure Hilfe!

mfg Cuin

13.10.2010 - 01:20 Uhr

Habe garnicht daran gedacht, dass Visibility vom Typ Enum ist.

Damit habe ich eig. gemeint, dass ich garnicht darauf gekommen bin, mir die Enum-Funktionaltität nützlich zu machen. D.h. dass ich mir die Doku noch öfter angucken hätte können und wäre trotzdem nicht auf die Idee gekommen^^ Ab und zu fehlt halt ein kleiner schubser 😉 Danke nochmals für den Tipp.

Habe mir die genannte Seite mehrmals durchgelesen... das Problem konnte ich leider trotzdem nicht lösen... hier mal ein Code-Auszug:


<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Test.Properties"
        Title="Test" Name="TestWindow"
        Closing="TestWindow_Closing">

    <Window.Resources>
        <local:Settings x:Key="settings" />
    </Window.Resources>

    <DockPanel Name="dockpanelMain"  DataContext="{StaticResource settings}"> 
<ToolBarTray  Name="ToolBarTray" Visibility="{Binding Path=Default.ToolBarTrayVisibility}">
...

mfg Cuin

13.10.2010 - 00:26 Uhr

Danke für die schnellen Antworten 😃

Habe garnicht daran gedacht, dass Visibility vom Typ Enum ist. Funktioniert jetzt (fast) alles super.

Mein einziges Problem ist jetzt noch, dass ich die Visibility zwar mit

ToolBarTray.Visibility = (Visibility)settings.ToolBarTrayVisibility;

abrufen kann, ich würde das aber gerne per xaml automatisch machen lassen, also so:

Visibility="{Binding Source={x:Static Properties:Settings.Default}, Path=ToolBarTrayVisibility}

Aber irgendwie tut sich da nix. Habe ich was falsch gemacht?

mfg Cuin

12.10.2010 - 23:50 Uhr

Hallo,

ist es irgendwie möglich in einer WPF-Anwendung Daten vom Typ Visibility abzuspeichern?
Also unter Properties.Settings?
Oder geht das nur mit dem Umweg über Zahlen? (Z.b. 1=Visibile, 2=Hidden, 3=Collapsed)

mfg Cuin

11.10.2010 - 22:38 Uhr

Habe so ein ähnliches Problem, das seinen Ursprung in der vorhergehenden Frage hat:

              <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="10*" MinWidth="10"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="35*" MinWidth="10"/>
                    </Grid.ColumnDefinitions>
                        <GridSplitter Grid.Column="1" Width="5" ResizeBehavior="PreviousAndNext">
                    </GridSplitter>
                    <TreeView Name="treeView" Grid.Column="0" BorderThickness="0" Width="175"/>
                    </Grid>

MinWidth funktioniert einwandfrei, der GridSplitter lässt sich optimal bedienen... einziges Manko:
Wenn ich die Fenstergröße ändere (z.B. maximiere), dann ändern sich die Breiten der Spalten so, dass die relative Größenordnung (also 10 zu 35) noch beibehalten werden.
Ich möchte aber, dass die breite der ersten Spalte einen absolutwert hat, der sich beim maximieren des Fensters nicht ändert. Leider funktioniert dann aber nicht mehr Minwidth der zweiten Spalte, wenn ich die relativen Breitenangaben durch absolute ersetze...

hat jemand eine Idee? Bei google findet man leider auch nur Fragen zu diesem Thema, aber keine vernünftigen antworten....

mfg Cuin

13.09.2010 - 13:52 Uhr

Achso, jetzt versteh ich^^

naja, funktioniert aber leider trotzdem nicht, da es ja keine match-überladung gibt, bei der man die anfangsposition mitangeben kann...

10.09.2010 - 18:45 Uhr

private static readonly Regex myRegex = new Regex("\b" + Regex.Escape(myWord) + "\b", RegexOptions.Compiled);
//Oder
Match match = Rgex.Match(/pattern/, myString);

Bei mir kommt da eine Fehlermeldung:

Einem statischen, schreibgeschützten Feld kann nichts zugewiesen werden (außer in einem statischen Konstruktor oder einem Variableninitialisierer).

Dein zweites Beispiel funktioniert leider nicht, da es keine Regex.Match-Überladung gibt, in der man die Anfangsposition mit angeben kann. (Für meine zweite Methode).

mfg Cuin

10.09.2010 - 13:45 Uhr

@kleines_eichhoernchen: Daran habe ich garnicht gedacht, dass die Satzzeichen in meinem übergebenen Wort als Regex-Token interpretiert werden. Das hätte zu unschönen Effekten geführt.

So, habe die Klasse nochmal umgeschrieben:


public static class HelperClass
    {
        private static Regex myRegex;

        public static int IndexOfWord(this string myString, string myWord)
        {
            myRegex = new Regex("\\b" + Regex.Escape(myWord) + "\\b", RegexOptions.Compiled);
            
            Match mtch = myRegex.Match(myString);

            if (mtch.Success)
                return mtch.Index;
            else
                return -1;
        }

        public static int IndexOfWord(this string myString, string myWord, int myPosition)
        {
            myRegex = new Regex("\\b" + Regex.Escape(myWord) + "\\b", RegexOptions.Compiled);

            Match mtch = myRegex.Match(myString, myPosition);

            if (mtch.Success)
                return mtch.Index;
            else
                return -1;
        }

Funktioniert so auch ganz gut und schaut auch besser aus^^

Den Satz verstehe ich allerdings noch nicht so ganz:

sondern die zurückgegebenen Matches entsprechend nochmal zu vergleichen.

Danke nochmals.^^

mfg Cuin

09.09.2010 - 19:41 Uhr

Gute Idee^^ Ich sollte mal den Code bei gelegenheit umschreiben. thx

mfg Cuin

09.09.2010 - 00:36 Uhr

@zommi: Vielen Dank. Mit diesem Tipp habe ich jetzt endlich mein Problem lösen können^^

Hier die Lösung:


public static class HelperClass
    {
        public static int IndexOfWord(this string myString, string myWord)
        {
            int myIndex;
            Regex myRegex = new Regex("\\b" + myWord + "\\b");

            if ((myIndex = myRegex.Match(myString).Index) == 0)
            {
                if (myString.IndexOf(myWord) == 0)
                {
                    return 0;
                }
                else
                {
                    return -1;
                }
            }
            else
            {
                return myIndex;
            }
        }

        public static int IndexOfWord(this string myString, string myWord, int myPosition)
        {
            int myIndex;
            Regex myRegex = new Regex("\\b" + myWord + "\\b");

            if ((myIndex = myRegex.Match(myString, myPosition).Index) == 0)
            {
                if (myString.IndexOf(myWord, myPosition) == 0)
                {
                    return 0;
                }
                else
                {
                    return -1;
                }
            }
            else
            {
                return myIndex;
            }
        }
}

Leider liefert Match.Index den Wert 0 anstatt -1 zurück, falls es das gesuchte Wort im String NICHT findet. Es kann natürlich auch sein, dass sich das Schlüsselwort an Position 0 befindet, deshalb muss man, falls Match.Index 0 liefert nochmal überprüfen ob IndexOf -1 liefert oder nicht.
Falls ja, dann befindet sich das gesuchte Wort definitiv nicht im String, anderfalls muss IndexOf 0 liefern, was bedeutet, dass sich das Wort an Position 0 befindet.

Vielen Dank an alle für eure schnelle und gute Hilfe!

mfg Cuin

08.09.2010 - 21:56 Uhr

@zommi: Ich bin ja so doof^^ Ich habe das "\b" als backspace interpretiert^^
Ich habe mich schon gefragt, wieso man das wort "ab" in "Test ab," findet, da nach "ab" ja kein leerzeichen steht sondern ein komma...

ok, ich finde jetzt wirklich nur die substrings, die ich auch finden möchte! 😃

Vielen Dank für eure Hilfe.

Hier nochmal ein link, der mir erklärt hat, was das "\b" Zeichen bedeutet:

http://www.regular-expressions.info/wordboundaries.html

Zum Schluss hätte ich da aber noch eine Frage: Wäre es sinnvoll bzw. ist es möglich mit verhältnismäßigem Aufwand, die String.IndexOf methode mit hilfe der hier gefundenen Lösung so zu überschreiben, dass sie nur ganze Wörter sucht?

08.09.2010 - 19:18 Uhr

OK, das ist schon mal eine gute Basis, an dem Regex(...) muss man zwar noch basteln aber vom grundgerüst schonmal ein guter Ansatz.

Wenn man als input das hier nimmt:


string input = "Hans blickte runter ins Tal";
string wordToFind = "er";

dann findet er nämlich auch das "er" in "runter"....

08.09.2010 - 13:00 Uhr

Erstmal danke für eure Tipps^^

@gfoidl: Wie herbivore schon erwähnte, ist das nicht wirklich eine passende methode, da ich ja dann alle möglichen Fälle abfangen müsste, was sicher mehr Aufwand wäre als meine eigene umständliche Lösung. Aber trotzdem Danke für den Tipp.

@Jochen1980: Genau das ist mein Problem^^

Ich habe nämlich einen Text bzw. Liedtext. Als erstes überprüfe ich ob sich das Schlüsselwort überhaupt in dem Lied befindet, das funktioniert mit meiner Methode auch super. Danach wird NUR der Vers in dem sich das Wort befindet an eine Methode weitergegben. Diese Methode splittet dann nochmal den Vers mit string.splitt(). Mein Problem ist jetzt, das ich mein Schlüsselwort wieder in dem string[] finden muss.

mit IndexOf("ab") würde ich ja nur das Wort "aber" findet.

Theoretisch hättte ich auch jedes Element im Array per String.compare mit meinem Schlüsselwort vergleichen können, da die Satzeichen aber noch vorhanden sind, funktioniert der vergleich nicht mehr.

Wörter wie "aber", "Haben" oder "Rabe" dürfen nicht gefunden werden"
Wörter mit Satzzeichen wie "ab," oder "ab!" hingegen schon.

Hiermal ein Codeausschnitt:


string[] splitter = Text.Split(new char[] { ' ', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

Bis jetzt habe ich noch keine Zeit gehabt, aber RegEx hört sich gut an. Ich versuche mal mein Problem damit zu lösen.

mfg Cuin

07.09.2010 - 22:38 Uhr

hmm... das Tutorial kenne ich schon.. weiß allerdings nicht wie ich das mit der IndexOf-Methode verbinden soll...

muss ich mir mal näher angucken... danke für den tipp^^

07.09.2010 - 16:53 Uhr

Hallo alle Zusammen,

wie die Überschrift schon sagt, versuche ich in einem vorhandenen String ein ganzes Wort zu finden. Mit dem normallen IndexOf würde ich z.b. im folgenden Beispiel nicht das richtige Wort finden.


string TempString = "Hans wollte 40 km laufen, aber ab 20 km hatte er keine Puste mehr";
string s = "ab";
int Position = TempStringt.IndexOf(s);

Als Position erhalte ich hier das "ab" in "aber" und nicht das alleinstehende "ab".

Ich könnte zwar z.B. mit


if (!char.IsLetter(TempString[Position - 1]) && !char.IsLetter(TempString[Position + s.Length]))
{

}

selber prüfen, ob es sich um ein alleinstehendes Wort handelt, aber da ich die IndexOf-Methode ziemlich oft benutze, ist mir dieser Weg ein wenig zu umständlich.

Hat jemand einen Vorschlag wie ich das Problem lösen kann?

29.07.2010 - 15:01 Uhr

Hallo alle Zusammen,

ich habe folgendes Problem:

Ich habe mittels diesem Code ein NumericUpDown in meinem Toolstrip ermöglicht:


[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip)]
public class ToolStripNumberControl : ToolStripControlHost
{
    public ToolStripNumberControl()
        : base(new NumericUpDown())
    {

    }

    protected override void OnSubscribeControlEvents(Control control)
    {
        base.OnSubscribeControlEvents(control);
        ((NumericUpDown)control).ValueChanged += new EventHandler(OnValueChanged);
    }

    protected override void OnUnsubscribeControlEvents(Control control)
    {
        base.OnUnsubscribeControlEvents(control);
        ((NumericUpDown)control).ValueChanged -= new EventHandler(OnValueChanged);
    }

    public event EventHandler ValueChanged;

    public Control NumericUpDownControl
    {
        get { return Control as NumericUpDown; }
    }

    public void OnValueChanged(object sender, EventArgs e)
    {
        if (ValueChanged != null)
        {
            ValueChanged(this, e);
        }
    }
}

Doch seltsamerweise kann ich nicht auf alle Eigenschaften des NumericUpDown zugreifen. So fehlt z.B. die Value-Eigenschaft. Andere Eigenschaften wie z.b. Visible kann ich dagegen schon beeinflussen...

Auch der Zugriff über

((NumericUpDown)Nup).Value = 1;

funktioniert nicht 😦

Desweiteren werden einfach alle Änderungen die ich im Designer mache ingnoriert. Wenn ich z.B. die Größe ändere, aus dem Designer rausgehe und wieder reingehe, dann steht wieder der alte Wert dran... was mache ich falsch?

Danke schonmal im Vorraus^^

08.07.2010 - 14:36 Uhr

Mein persönlicher Favourit:

http://www.multidata.at/SitesMD/Doc_VisualCSharp/visual_csharp_01_001.htm#mjbc63b05af6168fedc63c597ce4fa8394

Habe daraus selber den größten Teil meines bescheidenen Wissens gezogen^^

08.07.2010 - 14:17 Uhr

Richtig und gut erklärt!

Bitte die nächste Aufgabe stellen^^

08.07.2010 - 11:20 Uhr

Gibt es schon irgendwelche Neuigkeiten? Wird noch an dem Projekt gearbeitet?

08.07.2010 - 09:07 Uhr

Habe wiedermal eine frage:

Und zwar geht es um die Auflösung bzw. der "Größe" des Browsergames.

Ich gehe mal von einer Standardauflösung von 1024 x 768 Pixel aus.
Was aber nicht bedeutet, dass ich 1024 Pixel Platz habe für die Breite meines BG'S
Man muss ja noch die Breite der VScrollbar abziehen und den Rahmen des Browsers.

Gibt es irgendeine Standardbreite für Foren, BG etc? Oder muss ich die Breite durch testen selber herausfinden? Ich möchte nämlich auf keinen fall eine HScrollbar haben...