使用 neo4j 作为 WPF 自动完成框的数据源
Using neo4j as data source for a WPF Autocomplete Box
我尝试获取一个自动完成文本框 运行 neo4j 作为数据源,为此我需要将所有已创建的元素作为列表返回,我可以在其中 "Search" 。
我有一个列表,我有一个连接来查询 neo4j DB 以通过他们的名字获取所有人,一个 MessageBox 正在显示,只是为了测试,如果我们收到数据但如果我在我的文本框中输入一个字母我的应用程序只是冻结。
后面的代码:
public partial class UserControlQueryDB : UserControl
{
public UserControlQueryDB()
{
InitializeComponent();
GetSuggestionsFromNeoAsync();
}
private async Task<List<string>> GetSuggestionsFromNeoAsync() {
IDriver driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "neo4j"));
IAsyncSession session = driver.AsyncSession(o => o.WithDatabase("neo4j"));
var query2Neo = "MATCH (n:Person) RETURN n.Name";
IResultCursor cursor = await session.RunAsync(query2Neo);
List<string> found = await cursor.ToListAsync(record => record["name"].As<string>());
await cursor.ConsumeAsync();
await session.CloseAsync();
await driver.CloseAsync();
return found;
}
private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
bool found = false;
var border = (resultStack.Parent as ScrollViewer).Parent as Border;
var data = GetSuggestionsFromNeoAsync();
MessageBox.Show(data);
string query = (sender as TextBox).Text;
if (query.Length == 0)
{
// Clear
resultStack.Children.Clear();
border.Visibility = Visibility.Collapsed;
}
else
{
border.Visibility = Visibility.Visible;
}
// Clear the list
resultStack.Children.Clear();
// Add the result
foreach (var obj in data.Result)
{
if (obj.ToLower().StartsWith(query.ToLower()))
{
// The word starts with this... Autocomplete must work
addItem(obj);
found = true;
}
}
if (!found)
{
resultStack.Children.Add(new TextBlock() { Text = "No results found." });
}
}
private void addItem(string text)
{
TextBlock block = new TextBlock();
// Add the text
block.Text = text;
// A little style...
block.Margin = new Thickness(2, 3, 2, 3);
block.Cursor = Cursors.Hand;
// Mouse events
block.MouseLeftButtonUp += (sender, e) =>
{
textBox.Text = (sender as TextBlock).Text;
};
block.MouseEnter += (sender, e) =>
{
TextBlock b = sender as TextBlock;
b.Background = Brushes.PeachPuff;
};
block.MouseLeave += (sender, e) =>
{
TextBlock b = sender as TextBlock;
b.Background = Brushes.Transparent;
};
}
}
那就是 Xaml:
<StackPanel Orientation="Horizontal">
<TextBox Width="300" Padding="5, 3, 5, 3" KeyUp="TextBox_KeyUp" Name="textBox" />
<Border Width="298" Height="150" BorderBrush="Black" BorderThickness="1">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Name="resultStack"></StackPanel>
</ScrollViewer>
</Border>
</StackPanel>
不要忘记在事件处理程序中 await
您的 async
方法(并将 async
关键字添加到事件处理程序的签名中):
private async void TextBox_KeyUp(object sender, KeyEventArgs e)
{
bool found = false;
var border = (resultStack.Parent as ScrollViewer).Parent as Border;
var data = await GetSuggestionsFromNeoAsync(); //<--
...
我尝试获取一个自动完成文本框 运行 neo4j 作为数据源,为此我需要将所有已创建的元素作为列表返回,我可以在其中 "Search" 。
我有一个列表,我有一个连接来查询 neo4j DB 以通过他们的名字获取所有人,一个 MessageBox 正在显示,只是为了测试,如果我们收到数据但如果我在我的文本框中输入一个字母我的应用程序只是冻结。
后面的代码:
public partial class UserControlQueryDB : UserControl
{
public UserControlQueryDB()
{
InitializeComponent();
GetSuggestionsFromNeoAsync();
}
private async Task<List<string>> GetSuggestionsFromNeoAsync() {
IDriver driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "neo4j"));
IAsyncSession session = driver.AsyncSession(o => o.WithDatabase("neo4j"));
var query2Neo = "MATCH (n:Person) RETURN n.Name";
IResultCursor cursor = await session.RunAsync(query2Neo);
List<string> found = await cursor.ToListAsync(record => record["name"].As<string>());
await cursor.ConsumeAsync();
await session.CloseAsync();
await driver.CloseAsync();
return found;
}
private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
bool found = false;
var border = (resultStack.Parent as ScrollViewer).Parent as Border;
var data = GetSuggestionsFromNeoAsync();
MessageBox.Show(data);
string query = (sender as TextBox).Text;
if (query.Length == 0)
{
// Clear
resultStack.Children.Clear();
border.Visibility = Visibility.Collapsed;
}
else
{
border.Visibility = Visibility.Visible;
}
// Clear the list
resultStack.Children.Clear();
// Add the result
foreach (var obj in data.Result)
{
if (obj.ToLower().StartsWith(query.ToLower()))
{
// The word starts with this... Autocomplete must work
addItem(obj);
found = true;
}
}
if (!found)
{
resultStack.Children.Add(new TextBlock() { Text = "No results found." });
}
}
private void addItem(string text)
{
TextBlock block = new TextBlock();
// Add the text
block.Text = text;
// A little style...
block.Margin = new Thickness(2, 3, 2, 3);
block.Cursor = Cursors.Hand;
// Mouse events
block.MouseLeftButtonUp += (sender, e) =>
{
textBox.Text = (sender as TextBlock).Text;
};
block.MouseEnter += (sender, e) =>
{
TextBlock b = sender as TextBlock;
b.Background = Brushes.PeachPuff;
};
block.MouseLeave += (sender, e) =>
{
TextBlock b = sender as TextBlock;
b.Background = Brushes.Transparent;
};
}
}
那就是 Xaml:
<StackPanel Orientation="Horizontal">
<TextBox Width="300" Padding="5, 3, 5, 3" KeyUp="TextBox_KeyUp" Name="textBox" />
<Border Width="298" Height="150" BorderBrush="Black" BorderThickness="1">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Name="resultStack"></StackPanel>
</ScrollViewer>
</Border>
</StackPanel>
不要忘记在事件处理程序中 await
您的 async
方法(并将 async
关键字添加到事件处理程序的签名中):
private async void TextBox_KeyUp(object sender, KeyEventArgs e)
{
bool found = false;
var border = (resultStack.Parent as ScrollViewer).Parent as Border;
var data = await GetSuggestionsFromNeoAsync(); //<--
...